在Python中, 继承是指子类对父类资源的使用权

1 继承-属性与方法的使用权限

1.1 测试属性与方法分别如下

公有属性/方法

受保护属性/方法

私有属性/方法

class Animal:

a = 1 # 公有属性

_b = 2 # 受保护属性

__c = 3 # 私有属性

#公有方法

def t1(self):

print("t1")

# 受保护方法

def _t2(self):

print("t2")

# 私有方法

def __t3(self):

print("t3")

# 内置方法

def __init__(self):

print("init, Animal")

class Person(Animal):

# 在实例对象(子类)内对以上属性及方法的访问权限

def test(self):

print(id(self.a)) # 打印地址的目的是为了证明子类对父类属性继承是`可以使用`,而非`拥有副本`

print(self.a)

print(self._b)

# print(self.__c) # 不能访问私有属性

self.t1()

self._t2()

# self.__t3() # 不能访问私有方法

self.__init__()

p = Person()

p.test()

print(id(Animal.a))

p.test()

>>>> 打印结果

init, Animal

4502964848

1

2

t1

t2

init, Animal

4502964848

4502964848

1

2

t1

t2

init, Animal

除私有的属性和私有的方法, 其他属性和方法子类基本都能继承(具有使用权)

2 继承-通过子类给父类属性进行赋值时,默认是指给之类增加一个与父类同名的属性

class Father:

age = 10

class Son(Father):

pass

print(Son.age) # 访问父类属性

Son.age = 9 # 给子类增加与父类同名属性

print(Son.age)

print(Father.age)

print(Son.__dict__)

print(Father.__dict__)

>>>>打印结果

10

9

10

{'__module__': '__main__', '__doc__': None, 'age': 9}

{'__module__': '__main__', 'age': 10, '__dict__': , '__weakref__': , '__doc__': None}

3 继承的3种形态

继承的3种形态

4 几种形态应该遵循的标准原则

4.1 单继承

遵循"从下到上的原则"

自己身上没有这个资源, 就到父类里面去找,父类里面没有再往上找

4.2 无重叠的多继承

遵循"单调原则"

按照继承的先后顺序,优先调用左侧继承链上的资源

4.3 有重叠的多继承

遵循"从下到上的原则"

简单理解就是:

A继承B继承C

B重写了C类的方法, 那么A优先使用B类的方法

4 查看类的资源查找顺序方法

通过inspect模块进行

目的:假如继承链中多个父类重写的资源,要学会查找哪些类的重写资源会被优先调用

# 导入资源查看模块 inspect

import inspect

class D(object):

pass

class B(D):

pass

class C(D):

pass

class A(B, C):

pass

# 方法一

print(inspect.getmro(A))

# 方法二

print(A.__mro__)

# 方法三

print(A.mro())

>>>>打印结果

(, , , , )

(, , , , )

[, , , , ]

TODO:《 针对于几种标准原则的方案演化》

不同 Python 版本 MRO 原则

菱形继承链问题

5 资源覆盖(MRO 优先级高的优先调用)

5.1 原理

基于MRO的资源检索链

优先级高的类具有一个与优先级低的类一样的一个资源(属性或方法)

会先选择优先级高的资源 ,而摒弃优先级低的资源(造成"覆盖"的假象)

class D(object):

age = "d"

pass

class C(D):

age = "c"

def test(self):

print("c")

pass

class B(D):

# age = "b"

def test(self):

print("b")

pass

class A(B, C):

pass

a = A()

a.test()

print(A.mro())

print(A.age)

print(A().test())

>>>>打印结果

b

[, , , , ]

c

b

None

5.2 调用优先级高资源时,self 与 cls 的变化

结论:谁调用,就是谁

class D(object):

pass

class C(D):

def test(self):

print(self)

pass

class B(D):

def test(self):

print(self)

@classmethod

def test2(cls):

print(cls)

pass

class A(B, C):

pass

A.test2()

a = A()

a.test()

>>>>打印结果

6 在低优先级类的方法中,通过"super"调用高优先级类的方法

Python3.x

class B:

a = 1

def __init__(self):

self.b = 2

self.xxx = "123"

def t1(self):

print("t1")

@classmethod

def t2(cls):

print(cls)

print("t2")

@staticmethod

def t3():

print("t3")

class A(B):

c = 3

def __init__(self):

super().__init__()

self.e = "666"

def tt1(self):

print("tt1")

@classmethod

def tt2(cls):

super().t2()

print("tt2")

@staticmethod

def tt3():

print("tt3")

pass

a = A()

print(a.__dict__)

print("-" * 20)

A.tt2()

>>>>打印结果

{'b': 2, 'xxx': '123', 'e': '666'}

--------------------

t2

tt2

Python2.2+

class B:

a = 1

def __init__(self):

self.b = 2

self.xxx = "123"

def t1(self):

print("t1")

@classmethod

def t2(cls):

print(cls)

print("t2")

@staticmethod

def t3():

print("t3")

class A(B):

c = 3

def __init__(self):

super(A, self).__init__()

self.e = "666"

def tt1(self):

print("tt1")

@classmethod

def tt2(cls):

super(A, cls).t2()

print("tt2")

@staticmethod

def tt3():

print("tt3")

pass

a = A()

print(a.__dict__)

print("-" * 20)

A.tt2()

>>>>打印结果

{'b': 2, 'xxx': '123', 'e': '666'}

--------------------

t2

tt2

注意

super 和父类(超类)没有实质性的关联

仅仅是沿着MRO链条, 找到下一级节点

保证调用形式的统一

要是类名调用, 全是类名调用

要是super调用, 全是super调用

(混合使用容易出现死循环)

python类的方法三种访问权_Python基础33-面向对象(继承资源(属性与方法)的使用注意)...相关推荐

  1. python读取文件的三种方式_python中读取文件的f.seek()方法

    用于二进制文件中 F.seek方法 作用: 设置读写位置 F.seek(偏移量, whence=相对位置) 偏移量 大于0的数代表向文件末尾方向移动的字节数 小于0的数代表向文件头方向中移动的字节数 ...

  2. python读文件的三种方式_Python|读、写Excel文件(三种模块三种方式)

    python读写excel的方式有很多,不同的模块在读写的讲法上稍有区别: 用xlrd和xlwt进行excel读写: 用openpyxl进行excel读写: import xlrd from xlut ...

  3. 用python操作浏览器的三种方式_python的webbrowser模块支持对浏览器进行一些操作...

    python 的 webbrowser 模块支持对浏览器进行一些操作 主要有以下三个方法: webbrowser.open(url, new=0, autoraise=True) webbrowser ...

  4. python字符串换行的三种方式_Python 字符串换行的多种方式

    第一种: x0 = '<?xml version="1.0"?>' \ ' ' \ ' Python' \ ' Ruby' \ ' ' 第二种: x1 = '<? ...

  5. python三种结构_Python基础05 三种基本结构选择结构

    作者:玉树[林]风 欢迎转载,也请保留这段声明. 程序的三种基本结构 顺序结构 代码按照编写的顺序,自上而下逐行运行.如下图所示. 代码按照A->B->C的顺序执行 选择结构 代码运行到选 ...

  6. python字符串换行的三种方式_python中的字符串内部换行方法

    python中的字符串内部换行方法 python里有两种在字符串内部换行的方式(使用一个print打印多行字符串). 首先使用\n的方法大家肯定都知道了. 然后是使用 ''' 三个单引号大方法. 在交 ...

  7. 详解Python类中的三种方法

    前言 在Python中定义的类,常用的有三种方法(方法其实就是函数),他们分别是实例方法.类方法和静态方法.他们使用于不同的场景,今天就教大家如何区分并在类中正确的使用他们,达到我们需要的效果. 实例 ...

  8. python字符串换行的三种方式_Python:怎样拼装超长字符串和包含回车换行字符串...

    Python 中字符串可以使用单引号('--')或双引号("--")表示.反斜杠 \ 是转义字符.如果你不希望 \ 转义字符成特殊字符,可以在引号前添加 r 即可.如下所示: &q ...

  9. python 类和对象 经常用吗_python基础教程之对象和类的实际运用

    我们熟悉了对象和类的基本概念.我们将进一步拓展,以便能实际运用对象和类. 调用类的其它信息 中提到,在定义方法时,必须有self这一参数.这个参数表示某个对象.对象拥有类的所有性质,那么我们可以通过s ...

最新文章

  1. Node.js(nodejs)对本地JSON文件进行增、删、改、查操作(轻车熟路)
  2. Android必知必会-Android Studio下配置和使用Lambda
  3. 设计模式 之 设计的 六大原则(1)单一职责原则
  4. Juniper EX3400
  5. OpenCV数据类型转换:cnvertTo函数的使用
  6. React Native 环境配置
  7. 关于Java基础你不得不会的34个问题
  8. 今年美国什么工作最吃香?程序猿薪酬超医生
  9. 详解数据中心灾备切换技术
  10. java里不支持post请求_java – Spring Boot – 不支持请求方法’POST’
  11. uva 11997(优先队列)
  12. eclipse下载支持compiler compliance level 1.8的插件
  13. 爬取斗鱼所有房间及直播源
  14. 2022华为软挑成功退赛奖
  15. Adams— 系统级多体动力学仿真平台
  16. 高等工程数学(张韵华,汪琥庭,宋立功)—— 第一篇:线性代数
  17. 文本批量替换的正则表达式
  18. 穿越NAT的p2p通信方法研究
  19. 腾达ap设置说明_机身更小巧,AP免配置,腾达全千兆PoEAC一体化路由G05GPoE来了...
  20. html下拉栏加箭头,CSS-下拉菜单上的引导3箭头

热门文章

  1. 详解在 Linux 启动时,如何自动执行命令或脚本
  2. response生成图片验证码
  3. USACO crypt1
  4. android 汉字转拼音pinyin4j包
  5. 90后,一个即将成为程序员的我
  6. Lync Server存档和监控服务器PART A:准备篇
  7. 在exchange中设置外网邮件域名与内网域名不同
  8. hdu 1540(线段树单点更新 区间合并)
  9. nyist-组队赛(七)
  10. Pod定义YAML文件详解