[root@shuffle-dev py_test]$ vim sf_nameMangling.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class A(object):
def __init__(self):
self.__private()
self.public()
def __private(self):
print 'A.private()'
def public(self):
print 'A.public'
class B(A):
def __private(self):
print 'B.private()'
def public(self):
print 'B.public'
class C(A):
def __init__(self):
self.__private()
self.public()
@classmethod
def __private(cls):
print 'C.private'
@staticmethod
def public():
print 'public'
print '---create b---'
b=B()
print '---create c---'
c=C()
print '---method of class C---'
C._C__private()
C.public()
- 然而如下代码会遇到:NameError: global name 'typecode' is not defined
这里可以参考:http://python.jobbole.com/85100/
[root@shuffle-dev py_test]$ vim sf_classextend.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Author:xushuffle
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from array import array
class base(object):
def __init__(self,x,y):
self.x,self.y=x,y
def echo(self):
print self.x,self.y
class sub(base):
typecode='d'
def __init__(self,components):
self.components=array(typecode,components)
# s=sub(range(5))
# s.echo()
class sub2(base):
typecode='d'
def __init__(self,components):
self.x,self.y=components[0],components[1]
self.components=array(self.typecode,components)
s=sub2(range(5))
s.echo()
- python作为动态语言和java等静态语言的行为不太一致
[root@shuffle-dev py_test]$ python
Python 2.6.6 (r266:84292, Jul 10 2013, 22:48:45)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from sf_classextend import sub
0 1
>>> from dis import dis
>>> dis(sub)
Disassembly of __init__:
19 0 LOAD_GLOBAL 0 (array)
3 LOAD_GLOBAL 1 (typecode)
6 LOAD_FAST 1 (components)
9 CALL_FUNCTION 2
12 LOAD_FAST 0 (self)
15 STORE_ATTR 2 (components)
18 LOAD_CONST 0 (None)
21 RETURN_VALUE
>>>
dis模块的参考文档在这里:https://docs.python.org/2/library/dis.html
typecode是从global里面load的
例如
LOAD_FAST(var_num)
Pushes a reference to the local co_varnames[var_num] onto the stack.
- co_varnames是什么呢?
参考:https://www.jianshu.com/p/649ba6219d06
[root@shuffle-dev py_test]$ python
Python 2.6.6 (r266:84292, Jul 10 2013, 22:48:45)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> f=open('sf_classextend.py','r').read()
>>> co=compile(f,'sf_classextend.sub','exec')
>>> print co.co_varnames
()
>>> print co.co_names
('sys', 'reload', 'setdefaultencoding', 'array', 'object', 'base', 'sub', 'sub2', 'range', 's', 'echo')
>>> print co.co_consts
(-1, None, 'utf-8', ('array',), 'base', <code object base at 0x2aaed06c64e0, file "sf_classextend.sub", line 10>, 'sub', <code object sub at 0x2aaed06cd120, file "sf_classextend.sub", line 16>, 'sub2', <code object sub2 at 0x2aaed06d7738, file "sf_classextend.sub", line 24>, 5)
>>>