设为首页 收藏本站
查看: 1593|回复: 0

[经验分享] Python面向对象进阶及类成员

[复制链接]

尚未签到

发表于 2018-8-5 06:20:58 | 显示全部楼层 |阅读模式
再次了解多继承
  先来一段代码

  •   #!/usr/bin/env python
  •   # _*_ coding:utf-8 _*_
  •   
  •   class A:
  •       def bar(self):
  •           print("BAR")
  •           self.f1()
  •   
  •   class B(A):
  •       def f1(self):
  •           print("B")
  •   
  •   class C:
  •       def f1(self):
  •           print("C")
  •   
  •   class D(C, B):
  •       pass
  •   
  •   obj = D()
  •   obj.bar()
  执行结果

  •   /usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day03/s1.py
  •   BAR
  •   C
  •   
  •   Process finished with exit code 0
  流程释意:

  •   创建了类A、B、C、D;
  •   D继承了C和B,B继承了A,D内什么都不做,pass;
  •   创建一个对象obj,类是D,当执行D的bar方法的时候会先从C里面寻找有没有bar方法;
  •   C内没有bar方法,然后继续从B里面查找,B里面也没有,B的父类是A,A里面有bar方法,所以就执行了A的bar方法;
  •   A的bar方法首先输出了BAR;
  •   然后又执行了self.f1(),self=obj,相当于执行了obj.f1();
  •   执行obj.f1()的时候先从C里面查找有没有f1这个方法,C里面又f1这个方法;
  •   最后就执行C里面的f1方法了,输出了C
执行父类的构造方法

  •   lass Annimal:
  •       def __init__(self):
  •           print("Annimal的构造方法")
  •           self.ty = "动物"
  •   
  •   class Cat(Annimal):
  •       def __init__(self):
  •           print("Cat的构造方法")
  •           self.n = "猫"
  •           # 寻找Cat类的父类,然后执行父类的构造方法
  •           super(Cat, self).__init__()
  •   mao = Cat()
  •   print(mao.__dict__)
  执行结果

  •   /usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day03/s1.py
  •   Cat的构造方法
  •   Annimal的构造方法
  •   {'ty': '动物', 'n': '猫'}
  •   
  •   Process finished with exit code 0
  先执行了Cat的构造方法,然后又执行了Annimal的构造方法。
  第二种执行父类的方法如下:

  •   Annimal.__init__(self)
  不推荐使用
利用反射查看面向对象成员归属

  •   #!/usr/bin/env python
  •   # _*_ coding:utf-8 _*_
  •   
  •   class Foo:
  •       def __init__(self, name):
  •           self.name = name
  •   
  •       def show(self):
  •           print('show')
  •   
  •   
  •   obj = Foo("as")
  •   
  •   # 如果是类,就只能找到类里的成员
  •   print(hasattr(Foo, "show"))
  •   
  •   # 如果是对象,既可以找到对象,也可以找类里的成员
  •   print(hasattr(obj, "name"))
  •   print(hasattr(obj, "show"))
  执行结果

  •   /usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day03/s2.py
  •   True
  •   True
  •   True
  •   
  •   Process finished with exit code 0
利用反射导入模块、查找类、创建对象、查找对象中的字段
  s1脚本文件内容:

  •   #!/usr/bin/env python
  •   # _*_coding:utf-8 _*_
  •   
  •   # 导入模块
  •   m = __import__('s2', fromlist=True)
  •   
  •   # 去模块中找类
  •   class_name = getattr(m, "Foo")
  •   
  •   # 根据类创建对象
  •   obj =>
  •   
  •   # 去对象中找name对应的值
  •   print(getattr(obj, 'name')
      
      
  s2脚本文件内容

  •   #!/usr/bin/env python
  •   # _*_coding:utf-8 _*_
  •   
  •   class Foo:
  •       def __init__(self, name):
  •           # 普通字段,保存在对象中
  •           self.name = name
  执行结果

  •   /usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day04/s1.py
  •   ansheng
  •   
  •   Process finished with exit code 0
面向对象类成员之静态字段
  静态字段存在类中,如下:

  •   #!/usr/bin/env python
  •   # _*_coding:utf-8 _*_
  •   
  •   # 静态字段存在的意义就是将每个对象中重复的东西在类里面保存一份即可,这就是静态字段
  •   
  •   class Provice:
  •   
  •       # 静态字段
  •       contry = "China"
  •   
  •       def __init__(self, name):
  •           self.name = name
  •   
  •       def show(self):
  •           print(Provice.contry, self.name)
  •   
  •   hebei = Provice("河北")
  •   hebei.show()
  •   
  •   hubei = Provice("湖北")
  •   hubei.show()
  执行结果

  •   /usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day04/s2.py
  •   China 河北
  •   China 湖北
  •   
  •   Process finished with exit code 0
  类里面的成员类去访问,对象内的成员用对象去访问。
面向对象类成员之静态方法

  •   #!/usr/bin/env python
  •   # _*_coding:utf-8 _*_
  •   
  •   class Foo:
  •   
  •       # 静态方法括号内没有self,切方法前一行要加上@staticmethod
  •       @staticmethod
  •       def static():
  •       # def static(arg1, arg2): # 也可以设置参数
  •           print("static")
  •   
  •   # 静态方法通过类名+方法名既可执行
  •   Foo.static()
  •   # Foo.static("arg1", "arg2") 通过类调用的时候传入对于的参数即可
  •   
  •   # 静态方法也可以通过对象去访问,对于静态方法用类去访问
  •   obj = Foo()
  •   obj.static()
  执行结果

  •   /usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day04/s2.py
  •   static
  •   static
  •   
  •   Process finished with exit code 0
面向对象类成员之类方法

  •   #!/usr/bin/env python
  •   # _*_coding:utf-8 _*_
  •   
  •   class Foo:
  •   
  •       # 创建类方法的时候需要在方法前面加上@classmethod
  •       @classmethod
  •       def>
  •           print("类方法")
  •   
  •   # 调用类方法
  •   Foo.ClassMethod()
  执行结果:

  •   /usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day04/s2.py
  •   类方法
  •   
  •   Process finished with exit code 0
面向对象类成员内容梳理
  字段
  1.静态字段(每个对象都有一份)
  2.普通字段(每个对象都不同的数据)
  方法
  1.静态方法(无需使用对象封装的内容)
  2.类方法
  3.普通方法(适用对象中的数据)
  特性
  1.普通特性(将方法未造成字段)
  快速判断,类执行、对象执行:
  1.self —> 对象调用
  2.无self —> 类调用

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-546663-1-1.html 上篇帖子: Python 编码转换与中文处理 下篇帖子: Python学习入门基础教程(learning Python)--3.3.4 Python的if-elif-else语句
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表