二十二. Python基础(22)--继承
二十二. Python基础(22)--继承
● 知识框架
|
|
|
|
● 继承关系中self的指向
|
当一个对象调用一个方法时,这个方法的self形参会指向这个对象 |
|
class A: def get(self): self.say()
def say(self): print('AAAAA')
class B(A): def say(self): print('BBBBB')
b = B() b.get() # BBBBB # 当一个对象调用一个方法时,这个方法中的self就指向这个对象 # 子类先调用自己的属性或方法, 子类自己没有才调父类的 # 如果是class B(A):pass, 那么结果是'AAAAA' |
|
print(dir(b)) # ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'cls_att', 'get', 'name', 'say'] print(b.__dict__) # {'name': 'Arroz'} print(vars(b)) # {'name': 'Arroz'} print(b.__class__) # <class '__main__.B'> print(B.__class__) #<class 'type'> # 实例关系 print(B.__bases__) # (<class '__main__.A'>,) # 继承关系 print(B.__doc__) # This is class B |
● 经典类(old-style)和新式(new-style)类调用父类方法的区别
|
class Dog(Animal): def __init__(self, name): # Animal.__init__(self, name) # 经典类, 注意不要遗漏self super().__init__(name) # 新式类, 等价于super(Dog, self).__init__(name),读作"调用Dog的父类 的方法(calling Dog's parent's method)" |
|
内置函数super([type[, object-or-type]]) Return a proxy object that delegates method calls to a parent or sibling class of type. This is useful for accessing inherited methods that have been overridden in a class. The search order is same as that used by getattr() except that the type itself is skipped. |
● 综合案例
|
class Base: cls_attr = 'class attribute' def __init__(self, name, age, job): self.name = name self.age = age self.job = job def bmeth(self): print('Base method')
class Derived_0(Base): def dmeth(self): print('Derived method')
print(type(Base)) # <class 'type'>, 元类 print(type(Derived_0)) # <class 'type'>, 元类
# 没有添加新的对象属性, 不用使用super() d_0 = Derived_0('Paul', 55, 'Singer') print(d_0.job)
# 下面添加了添加了新的对象属性, 需要使用super() class Derived_1(Base): def __init__(self, name, age, job, hobby): super(Derived_1, self).__init__(name, age,job) # ※ self.hobby = hobby def dmeth(self): print('Derived method') def show(self): print(self.name, self.age, self.job,self.hobby)
class Derived_2(Base): def __init__(self, name, hobby): super(Derived_2, self).__init__(name, 20, 'teacher') # 子类调用父类方法时, 参数的个数不能缺少, 并且可以把已知的属性先传给父类的构造函数 self.hobby = hobby def dmeth(self): print('Derived method') def show(self): print(self.name, self.age, self.job,self.hobby)
class Derived_3(Base): def __init__(self, hobby): super(Derived_3, self).__init__("Paul", 22, 'painter') # 子类调用父类方法时, 参数的个数不能缺少, 并且可以把已知的属性先传给父类的构造函数 self.hobby = hobby
def dmeth(self): print('Derived method')
def show(self): print(self.name, self.age, self.job, self.hobby)
#① ####################################################### b = Base('Arroz', 18, 'teacher') print(Base.__dict__) # 类的属性 ''' {'__module__': '__main__', 'cls_attr': 'class attribute', '__init__': <function Base.__init__ at 0x00000000028EA840>, 'bmeth': <function Base.bmeth at 0x00000000028EA8C8>, '__dict__': <attribute '__dict__' of 'Base' objects>, '__weakref__': <attribute '__weakref__' of 'Base' objects>, '__doc__': None} ''' print(b.__dict__) # 对象属性 ''' {'name': 'Arroz', 'age': 18, 'job': 'teacher'} ''' print('----------------------') #② ####################################################### d_1 = Derived_1('Arroz', 18, 'teacher','swimming') d_1.show() # Arroz 18 teacher swimming print('----------------------') #③ ####################################################### d_2 = Derived_2('Pwter', 'skating') d_2.show() # Pwter 20 teacher skating print('----------------------') #④ ####################################################### d_3 = Derived_3('jogging') d_3.show() # Paul 22 painter jogging |
二十二. Python基础(22)--继承的更多相关文章
- 二十四. Python基础(24)--封装
二十四. Python基础(24)--封装 ● 知识结构 ● 类属性和__slots__属性 class Student(object): grade = 3 # 也可以写在__slots ...
- 二十六. Python基础(26)--类的内置特殊属性和方法
二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...
- 二十五. Python基础(25)--模块和包
二十五. Python基础(25)--模块和包 ● 知识框架 ● 模块的属性__name__ # my_module.py def fun1(): print("Hello& ...
- JAVA基础知识总结:一到二十二全部总结
>一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...
- python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法
python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...
- Bootstrap <基础二十二>超大屏幕(Jumbotron)
Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...
- python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码
python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...
- python3.4学习笔记(二十五) Python 调用mysql redis实例代码
python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...
- python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字
python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...
随机推荐
- 查询oracle数据字典,并对应出hive的数据类型
SQL开始 select t2.owner||'.'||t2.TABLE_NAME 源表名, 'dl_{0}_seq.'||'tt_{1}_'||lower(t2.table_name) hive表名 ...
- linux关闭终端响铃
title: linux关闭终端响铃 date: 2018-01-25 15:10:14 tags: linux categories: linux 在终端输入或是直接在.bashrc里添加一行 xs ...
- (转载)关于管理计算机\\xp1 找不到网络路径的解决方案
关于管理计算机\\xp1 找不到网络路径的解决方案 使用域管理员登录域控DC,然后打开AD用户和计算机 选择一台域成员计算机,然后选择管理,结果出现如下提示:点击确定后出现如下提示随后,立刻用域管理员 ...
- PowerShell 语法备忘
1.挡可能出现 .0 的时候需要加上引号 2.使用 -Join 或者 + 进行字符串拼接 3.在cmd 命令下可以使用 set /a s=1+2 表示需要进行计算,而不是拼接
- Flask最强攻略 - 跟DragonFire学Flask - 第十五篇 Flask-Script
其实本章就是为下一章做的铺垫啦,但是也要认真学习哦 Flask-Script 从字面意思上来看就是 Flask 的脚本 是的,熟悉Django的同学是否还记得Django的启动命令呢? python ...
- 记录 用tiny6410 j-link eclipse 在线调试裸机代码leds
1.nand flash烧写uboot 并且启动nandflash uboot,用来初始化6410,进入uboot命令行界面 2.在terminal中输入JLinkGDBServer -device ...
- PriorityBlockingQueue 原理分析
PriorityBlockingQueue是一个支持优先级的无界阻塞队列,直到系统资源耗尽.默认情况下元素采用自然顺序升序排列.也可以自定义类实现compareTo()方法来指定元素排序规则,或者初始 ...
- VS2013的x86汇编语言开发环境配置
转载:https://blog.csdn.net/infoworld/article/details/45085415 转载:https://blog.csdn.net/u014792304/arti ...
- container(容器),injection(注入)
1.container为什么会出现? 在书写程序的时候,我们常常需要对大量的对象引用进行管理.为了实现有效的归类管理,我们常常将同类的引用放置在同一数据容器中.由于数据容器中存放了我们随时可能需要使用 ...
- Character Encoding in .NET
https://docs.microsoft.com/en-us/dotnet/standard/base-types/character-encoding#Encodings Characters ...

