dir()
#列出所有内置函数或属性
In [202]: class Test1(object):
.....: def __init__(self):
.....: self.__tt = 200
.....:
In [203]: t = Test1()
In [204]: dir(t) #列出所有内置函数或属性
Out[204]:
['_Test1__tt',
'__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__']
xx
: 公有变量。
_x
: 单前置下划线,私有化属性或方法,其它模块中用from somemodule import *
导入 不能使用,类对象和子类可以访问。
__xx
:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)。
__xx__
: 双前后下划线,用户名字空间的魔法对象或属性。例如:__init__
, __ 不要自己发明这样的名字。
xx_
: 单后置下划线,用于避免与Python关键词的冲突。
通过name mangling( 名字重整 (目的就是以防子类意外重写基类的方法或者属性) 如:_Class__name
)机制就可以访问private了。
总结
- 父类中属性名为
__名字
的,子类不继承,子类不能访问。 - 如果在子类中向
__名字
赋值,那么会在子类中定义的一个与父类相同名字的属性。(用自己的对象引用向__名字
赋值也相当于重新定义了一个属性)。 -
_名
的变量、函数、类在使用from xxx import *
时都不会被导入。
property
class Test(object):
def __init__(self):
self.__num = 0
def getNum(self):
print("----getter------")
return self.__num
def setNum(self, num):
print("----setter------")
if isinstance(num, int):
self.__num = num
else:
print("不是整数,不能赋值")
num = property(getNum,setNum)
t = Test()
t.num = "123"
print(t.num)
结果:
----setter------
不是整数,不能赋值
----getter------
0
property 的另一种形式
class Test(object):
def __init__(self):
self.__num = 0
@property
def num(self):
print("----getter------")
return self.__num
@num.setter
def num(self, value):
print("----setter------")
if isinstance(value, int):
self.__num = value
else:
print("不是整数,不能赋值")
t = Test()
t.num = "123"
print(t.num)
结果:
----setter------
不是整数,不能赋值
----getter------
0
网友评论