加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

史上最全Python面向对象编程

发布时间:2019-03-27 13:15:21 所属栏目:建站 来源:浪子燕青
导读:面向对象编程和函数式编程(面向过程编程)都是程序设计的方法,不过稍有区别。 面向过程编程: 1. 导入各种外部库 2. 设计各种全局变量 3. 写一个函数完成某个功能 4. 写一个函数完成某个功能 5. 写一个函数完成某个功能 6. 写一个函数完成某个功能 7. 写一

13. author作者信息

  1. __author__ = "Jack" 
  2. def show(): 
  3.     print(__author__) 
  4. show() 

14. slots

Python作为一种动态语言,可以在类定义完成和实例化后,给类或者对象继续添加随意个数或者任意类型的变量或方法,这是动态语言的特性。例如:

  1. def print_doc(self): 
  2.     print("haha") 
  3.  
  4. class Foo: 
  5.     pass 
  6.  
  7. obj1 = Foo() 
  8. obj2 = Foo() 
  9. # 动态添加实例变量 
  10. obj1.name = "jack" 
  11. obj2.age = 18 
  12. # 动态的给类添加实例方法 
  13. Foo.show = print_doc 
  14. obj1.show() 
  15. obj2.show() 

但是!如果我想限制实例可以添加的变量怎么办?可以使slots限制实例的变量,比如,只允许Foo的实例添加name和age属性。

  1. def print_doc(self): 
  2.     print("haha") 
  3. class Foo: 
  4.     __slots__ = ("name", "age") 
  5.     pass 
  6. obj1 = Foo() 
  7. obj2 = Foo() 
  8. # 动态添加实例变量 
  9. obj1.name = "jack" 
  10. obj2.age = 18 
  11. obj1.sex = "male"       # 这一句会弹出错误 
  12. # 但是无法限制给类添加方法 
  13. Foo.show = print_doc 
  14. obj1.show() 
  15. obj2.show() 
  16. 由于'sex'不在__slots__的列表中,所以不能绑定sex属性,试图绑定sex将得到AttributeError的错误。 
  17. Traceback (most recent call last): 
  18.   File "F:/Python/pycharm/201705/1.py", line 14, in <module> 
  19.     obj1.sex = "male" 
  20. AttributeError: 'Foo' object has no attribute 'sex' 

需要提醒的是,slots定义的属性仅对当前类的实例起作用,对继承了它的子类是不起作用的。想想也是这个道理,如果你继承一个父类,却莫名其妙发现有些变量无法定义,那不是大问题么?如果非要子类也被限制,除非在子类中也定义slots,这样,子类实例允许定义的属性就是自身的slots加上父类的slots。

成员保护与访问机制

有些对象你不想外部访问,即使是通过调用类对象也无法访问,那就请认真学完本章节。

私有成员

  1. class obj: 
  2.     def __init__(self,name): 
  3.         self.name=name 
  4.     def pri(self): 
  5.         print self.name 
  6.     __age = 18 
  7.     # 加上双下划线的就是私有变量,只能在类的内部访问,外部无法访问 
  8. a = obj('zhao') 
  9. a.pri() 

运行结果:

  1. zhao 

如果要在类中调用这个私有成员,可以这么用

  1. class obj: 
  2.     def __init__(self,name): 
  3.         self.name=name 
  4.     def prin(self): 
  5.         print self.name 
  6.     __age = 18 
  7.     # 加上双下划线的就是私有变量,只能在类的内部访问,外部无法访问 
  8.     @classmethod 
  9.     # 如果要在类中调用,首先调用类方法 
  10.     def pri(cls): 
  11.         print cls.__age 
  12.         # 然后在使用 
  13. a = obj('zhao') 
  14. a.prin() 
  15. obj.pri() 
  16. # 通过这样直接调用类中的私有变量 

运行结果:

  1. zhao
  2. 18 

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读