类成员:
    # 字段
        - 普通字段,保存在对象中,执行只能通过对象访问
        - 静态字段,保存在类中,  执行 可以通过对象访问 也可以通过类访问
       
    # 方法
        - 普通方法,保存在类中,由对象来调用,self=》对象
        - 静态方法,保存在类中,由类直接调用,对象也可以调用
        -   类方法,保存在类中,由类直接调用,cls=》当前类,对象也可以调用

  1. class Foo:
  2. nation = 'china'# 静态字段
  3. def __init__(self, name):
  4. self.name = name # 普通字段
  5.  
  6. def show(self): # 普通方法
  7. print(self.name)
  8.  
  9. @staticmethod # 静态方法
  10. def stat(a1,a2):
  11. print(a1,a2)
  12.  
  13. @classmethod # 类方法
  14. def classmd(cls):# cls 是类名
  15. print(cls)
  16. print('classmd')
  17.  
  18. obj = Foo('pis')
  19. obj.name
  20. obj.show()
    #Foo.show(obj)#也能成功调用,传入对象参数
  21. Foo.stat(1,2)#类直接调用
  22. Foo.classmd()#类直接调用
    obj.stat(1,2) #对象直接调用
    obj.classmd()#对象直接调用

python并没有真正的私有属性(c++有public protect private)

实际上:用__定义的属性,只是被改名换姓而已。

       用_定义的属性,意义在于唤起用户的注意,看成私有属性.实际上只是普通方法。

表现形式:双下划线的函数或属性,在类定义中(类中方法)可以调用和访问,类的实例不可以直接访问,子类不可访问。

单下划线的函数或属性,在类定义中(类中方法)可以调用和访问,类的实例可以直接访问,子类中可以访问;

对于双下划线的函数或属性,Python解释器使用了名字混淆的方法, 将私有的方法"__method"变成了"_classname__method"了。

  1. class Base(object):#object 为基类,有一些常用的方法
  2. def __private(self):
  3. print("private value in Base")
  4.  
  5. def _Base__private(self):
  6. print("_Base__private value in Base")#如果没有定义,则调用上一方法
  7.  
  8. def _protected(self): #已被覆盖
  9. print("protected value in Base")
  10.  
  11. def public(self):
  12. print("public value in Base")
  13. self.__private()
  14. """此时调用父类的方法-----------原因如下:
  15. self.__private()方法调用时先从子类寻找,再从父类寻找,没有则报错。
  16. 如果是子类的普通方法调用,虽然子类的私有方法已改名,但能识别,而调用子类的私有方法。
  17. 现在父类的public调用,而子类的私有方法已改名,不能识别。
  18. 父类的public方法只能寻找并调用父类的__private()方法。
  19. 我们知道子类的普通方法能够调用子类的私有方法(虽然已改名),父类也是。所以能够找到父类的私有方法。
  20. 那么父类的私有方法改名了吗?我们加入代码测试------已改
  21. """
  22. self._protected()#已被覆盖
  23.  
  24. class Derived(Base):
  25. def __private(self):
  26. print("override private")
  27.  
  28. def _protected(self):
  29. print("override protected")
  30.  
  31. d = Derived() #创建对象
  32. d.public() #继承父类的方法
  33. d._protected()#调用子类的方法
  34. d._Derived__private()#调用子类__private(),不推荐使用。不符合初衷。
  35.  
  36. #d.__private()#已改名,不能调用。父类就算有相同方法根本看不到。

结果如下:

  1. public value in Base
  2. _Base__private value in Base
  3. override protected
  4. override protected
  5. override private

python 继承

1. 多重继承时方法查找顺序如何呢?

类都有一个名为 __mro__ 的属性, 它的值是一个元组, 按照方法解析顺序列出各个超类, 从当前类一直向上, 直到object 类。 D 类的 __mro__ 属性如下 :

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

通俗点也就是三大原则:a. 左侧优先
                                        b. 一条道走到黑
                                        c. 同一个根时,根最后执行

2. 单继承和多继承中构造函数__init__

    单继承情况

    (1)子类默认无__init__时,则会直接继承父类__init__

    (2)子类中含有__init__时,不会自动调用父类__init__,如需使用父类__init__中的变量,则需要在子类__init__中显式调用

     多继承情况
    (1)子类继承于多个父类,并且子类无__init__时,则按继承顺序(MRO),哪个父类在最前面且有自己的__init__,则继承它;若最前面的父类无__init__,则继承第二个父类的__init__,若还是无__init__,则依次往后寻找,直到继承的某个父类含__init__。

    (2)子类继承于多个父类,并且子类含__init__时,和单继承的(2)类似,不会自动调用所有父类__init__,如需使用某个父类__init__中的变量,则需要在子类__init__中显式调用

python 类与对象解析的更多相关文章

  1. python类与对象各个算数运算魔法方法总结

    1.python类与对象各个算术运算魔法方法总结: 2.各个魔法方法应用举例: 3.实例训练: (1)我们都知道在 Python 中,两个字符串相加会自动拼接字符串,但遗憾的是两个字符串相减却抛出异常 ...

  2. python 类和对象的属性

    python类和对象的属性分为类属性和对象属性两大类,类属性属于类,而对象属性属于对象. 1. 父类的对象属性会被子类的对象继承. 2. 父类的类属性会被子类继承,还是作为类属性,如果父类改变了类属性 ...

  3. 一文讲全了Python 类和对象内容

    摘要:这是一个关于 Python 类和对象的全部内容. 本文分享自华为云社区<从零开始学python | Python 类和对象-面向对象编程>,原文作者:Yuchuan  . Pytho ...

  4. python类、对象

    python类.对象 学习完本篇,你将会深入掌握 什么是类,对象 了解类和对象之间的关系 能独立创建一个People(人类),属性有姓名.性别.年龄.提供一个有参的构造方法,编写一个show方法,输出 ...

  5. python 类和对象

    类和对象 类 1.类的组成    数据和函数,二者是类的属性 2.两个作用: 实例化 属性引用  属性引用:类名.属性(增删改查)   实例化: 类名加括号就是实例化,会自动出发__init__的运行 ...

  6. Python类和对象

    目录 类与对象 其他方法 继承 经典类和新式类 派生 组合 接口.归一化设计与抽象类 继承实现的原理 子类中调用父类的方法 指名道姓 super()方法 多态与多态性 封装 单下划线开头 双下划线开头 ...

  7. python 类、对象、方法、属性

    在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...

  8. python类、对象、方法、属性之类与对象笔记

    python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗, ...

  9. python类与对象基本语法

    面向对象编程的2个非常重要的概念:类和对象. 对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念--类. 类就相当于制造飞机时的图纸,用它 ...

随机推荐

  1. 实验二 Java面向对象程序化设计

    实验二 Java面向对象程序设计 一.  实验要求 1.完成实验.撰写实验报告,以博客方式发表在博客园 2.实验报告重点是运行结果.遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等).解决办 ...

  2. 一个web项目中间的团队管理

    一个web项目中间的团队管理     最近在参加一个比赛,我们选的题目是:MOOC大型网络在线课堂.这个题目是我们五个人都想做的,我们的成员都是志同道合的五个人.   作为团队的统率者:   定义规范 ...

  3. 《软件工程和Python》PYTHON效能分析和Django

    资料汇总网站:http://www.yzhiliao.com/my/course/55 一..作业下面两个题目任选一题: (1)运用jieba库分词(或者你喜欢的其他库),并把代码发到git上去(不发 ...

  4. Java自学基础用法

    在慕课上面简单学习了一下java语言的用法 简单的用法总结记录一下. 代码(学习输入,输出): package hello; import java.util.Scanner; public clas ...

  5. mac下使用marsedit写博客

    在Windows习惯了使用Windows live write写好博客,然后发布上去,到了mac下,发现了一个很好的替代品  MarseEdit 下载安装后,打开出现如下解码,选择 I already ...

  6. CentOS 7.2修改网卡名称

    #!/bin/bash #Centos7.2修改网卡名称ens33为eth0 #2017/05/19 if [ -f /etc/sysconfig/grub ];then cd cp /etc/sys ...

  7. js异步上传图片

    <!DOCTYPE html><html xmlns = "http://www.w3.org/1999/xhtml" ><head><m ...

  8. [转帖]CentOS基础命令大全

    https://www.toutiao.com/i6601298434651587085/ 1.关机 (系统的关机.重启以及登出 ) 的命令 shutdown -h now 关闭系统(1) init ...

  9. js框架总结

    参考地址 http://www.techweb.com.cn/network/system/2015-12-23/2245809.shtml https://www.cnblogs.com/mbail ...

  10. Java 流程控制

                                   Java    流程控制 Java 分支结构 - if...else/switch 顺序结构只能顺序执行,不能进行判断和选择,因此需要分支 ...