Python面向对象高级

直接调用父类方法

class A:
def __init__(self):
print("hello")
class B(A):
def __init__(self):
A.__init__()

多继承

class C(A,B):
# ...
# 多继承的查找循序是从左往右,注意继承顺序。
# 比如调用某个方法,A中也有B中也有,那么默认就用的A的方法。

slots

class Student:
__slots__ = ('name','age')
s = Student()
s.name = "ar" # 正确
s.score = 95 # 报错,attribute err

slots限定只允许动态加name和age这两个实例属性。在子类中会继承slots,子类自身定义slots的时候两者取并集。

@property

property装饰器用来解决反复调用麻烦的问题,简化了函数调用。

# 直接抄例子了
# 不加装饰器
class Student(object): def get_score(self):
return self._score def set_score(self, value):
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value # 加装饰器
class Student(object): @property
def score(self):
return self._score @score.setter
def score(self, value):
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value # 直接调用函数就可以检验

super

在pytorch和mxnet中继承的时候都有这个东西,一探究竟。

# 举个例子
class A:
def __init__(self):
print("Enter A")
print("Leave A")
class B(A):
def __init__(self):
print("Enter B")
super(B, self).__init__()
print("Leave B")
class C(A):
def __init__(self):
print("Enter C")
super(C, self).__init__()
print("Leave C")
class D(A):
def __init__(self):
print("Enter D")
super(D, self).__init__()
print("Leave D")
class E(B, C, D):
def __init__(self):
print("Enter E")
super(E, self).__init__()
print("Leave E")
E()
'''
Enter E
Enter B
Enter C
Enter D
Enter A
Leave A
Leave D
Leave C
Leave B
Leave E
'''

首先我们要知道,python是解释型语言,执行到哪里就开始解释然后得到结果,所以我们从程序运行处开始看。

  1. 实例化对象E,调用构造函数
  2. 输出Enter E
  3. 开始调用父类init,调用B的init,输出Enter B,发现要掉B的父类,super特殊就在这,要按照mro顺序来调用,所以走到这里要调B的父类A的init时,发现A之前还有CD没有调用,那么此时要去先调用CD的init
  4. 调用C的init,输出Enter C,同样的,发现A之前还有D
  5. 调用D的init,输出Enter D,A之前没有人了
  6. 调用A的init,输出Enter A,输出leave A
  7. 从D返回,输出leave D
  8. ...

所以super的好处是,当多个类继承自同一类的时候,调用父类函数的时候会有一个mro查找顺序,以防止父类的函数被多次调用。至于mro,可以调用E.MRO()来查看。

最新文章

  1. Java连接Oracle database小结
  2. gulp同步执行任务
  3. 使用discovery板上的st-link给别的板子下载
  4. android download manager
  5. python+eclipse环境搭建
  6. PowerDesigner连接Oracle数据库生成数据模型【数据源连接方式】
  7. 设置checkbox选中,设置radio选中,根据值设置checkbox选中,checkbox勾选
  8. Mac下安装Scrapy
  9. Linux下Matlab崩溃的解决方法
  10. oracle中文支持
  11. sql语句判断两个时间段是否有交集
  12. 【Java】关于Java8 parallelStream并发安全的思考
  13. [Swift]LeetCode35. 搜索插入位置 | Search Insert Position
  14. Android破解学习之路(十一)—— 关于去更新
  15. MySQL8.0 优化
  16. react的注意点
  17. zabbix3.0对tcp连接数和状态的监控优化
  18. pytorch中检测分割模型中图像预处理探究
  19. 2019.03.30 Head first
  20. tomcat 启动报错 Invalid character found in method name. HTTP method names must be tokens

热门文章

  1. oracle wm_concat函数 列转行 分组函数
  2. MB Star C5 Functions
  3. nginx + uwsgi 配置参考
  4. CENTOS7下安装REDIS4.0.11
  5. transient关键字与序列化、反序列化
  6. VUE环境搭建及打包上线
  7. B P5 第十三届北航程序设计竞赛预赛
  8. CentOS7/Ubuntu Linux java jdk 环境变量配置
  9. LeetCode 167.两数之和(C++)
  10. 3n+1猜想