|
13. author作者信息
- __author__ = "Jack"
- def show():
- print(__author__)
- show()
14. slots
Python作为一种动态语言,可以在类定义完成和实例化后,给类或者对象继续添加随意个数或者任意类型的变量或方法,这是动态语言的特性。例如:
- def print_doc(self):
- print("haha")
-
- class Foo:
- pass
-
- obj1 = Foo()
- obj2 = Foo()
- # 动态添加实例变量
- obj1.name = "jack"
- obj2.age = 18
- # 动态的给类添加实例方法
- Foo.show = print_doc
- obj1.show()
- obj2.show()
但是!如果我想限制实例可以添加的变量怎么办?可以使slots限制实例的变量,比如,只允许Foo的实例添加name和age属性。
- def print_doc(self):
- print("haha")
- class Foo:
- __slots__ = ("name", "age")
- pass
- obj1 = Foo()
- obj2 = Foo()
- # 动态添加实例变量
- obj1.name = "jack"
- obj2.age = 18
- obj1.sex = "male" # 这一句会弹出错误
- # 但是无法限制给类添加方法
- Foo.show = print_doc
- obj1.show()
- obj2.show()
- 由于'sex'不在__slots__的列表中,所以不能绑定sex属性,试图绑定sex将得到AttributeError的错误。
- Traceback (most recent call last):
- File "F:/Python/pycharm/201705/1.py", line 14, in <module>
- obj1.sex = "male"
- AttributeError: 'Foo' object has no attribute 'sex'
需要提醒的是,slots定义的属性仅对当前类的实例起作用,对继承了它的子类是不起作用的。想想也是这个道理,如果你继承一个父类,却莫名其妙发现有些变量无法定义,那不是大问题么?如果非要子类也被限制,除非在子类中也定义slots,这样,子类实例允许定义的属性就是自身的slots加上父类的slots。
成员保护与访问机制
有些对象你不想外部访问,即使是通过调用类对象也无法访问,那就请认真学完本章节。
私有成员
- class obj:
- def __init__(self,name):
- self.name=name
- def pri(self):
- print self.name
- __age = 18
- # 加上双下划线的就是私有变量,只能在类的内部访问,外部无法访问
- a = obj('zhao')
- a.pri()
运行结果:
- zhao
如果要在类中调用这个私有成员,可以这么用
- class obj:
- def __init__(self,name):
- self.name=name
- def prin(self):
- print self.name
- __age = 18
- # 加上双下划线的就是私有变量,只能在类的内部访问,外部无法访问
- @classmethod
- # 如果要在类中调用,首先调用类方法
- def pri(cls):
- print cls.__age
- # 然后在使用
- a = obj('zhao')
- a.prin()
- obj.pri()
- # 通过这样直接调用类中的私有变量
运行结果:
- zhao
- 18
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|