| 
                         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 
 
                          (编辑:滁州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |