python是动态语言,可以给任何对象绑定属性
>>> class Test(object):
pass
>>> t = Test()
>>> t.test = '12312312'
>>> t.test
'12312312'
>>> type(t)
<class '__main__.Test'>
私有属性 __
python没有private等关键字来修饰,凭自觉。
>>> class PrivateTest(object):
def __init__(self, name, mail, phone):
self.__name = name
self._mail = mail
self.phone = phone
>>> ptest = PrivateTest("nn", "mm@123.com", '123123123')
>>> ptest.__name
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'PrivateTest' object has no attribute '__name'
>>> ptest._mail
'mm@123.com'
>>> ptest.phone
'123123123'
>>> ptest.name == "haha"

可以看出来__name被重命名为_PrivateTest__name,不过python并不会阻止你用这个名字去访问,默认添加了单_的变量都不要随意访问。
使用 __slots__
使用__slots__来限制,name不在元组中,所以无法绑定
>>> class Test(object):
__slots__ = ('test')
pass
>>> t = Test()
>>> t.name = "nn"
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'Test' object has no attribute 'name'
>>> t.test = 'tt'
如果是子类,子类不继承父类的__slots__,__slots__仅对当前类起作用。
class GTest(Test):
pass
t = GTest()
t.name = 'n'
t.name
'n'
4731

被折叠的 条评论
为什么被折叠?



