Skip to content

Commit

Permalink
updated
Browse files Browse the repository at this point in the history
  • Loading branch information
andytyc committed Mar 20, 2023
1 parent 2c2a159 commit 34bb431
Show file tree
Hide file tree
Showing 6 changed files with 433 additions and 19 deletions.
Binary file added .DS_Store
Binary file not shown.
113 changes: 104 additions & 9 deletions seed/02-base-基础语法/06-obj-面向对象-类.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,19 @@
- [3. 其他方法](#3-其他方法)
- [继承](#继承)
- [单继承、多继承、重写方法](#单继承多继承重写方法)
- [重写时选择调用父类方法](#重写时选择调用父类方法)
- [1. 子类内部使用](#1-子类内部使用)
- [super 调用父类方法](#super-调用父类方法)
- [1. 子类内部标准使用](#1-子类内部标准使用)
- [2. 子类的对象使用](#2-子类的对象使用)
- [3. 子类内部直接调用](#3-子类内部直接调用)
- [4. 总结和例子](#4-总结和例子)
- [多继承 (MRO)](#多继承-mro)
- [多态](#多态)
- [什么是多态](#什么是多态)
- [类如何表现多态](#类如何表现多态)
- [进阶理解](#进阶理解)
- [Animal (入门)](#animal-入门)
- [常用方法](#常用方法)
- [其他](#其他)
- [如何判断是什么类型?是否是谁的子类](#如何判断是什么类型是否是谁的子类)

<!-- Added by: edy, at: 2023年 3月16日 星期四 19时52分08秒 CST -->
<!-- Added by: edy, at: 2023年 3月20日 星期一 13时48分26秒 CST -->

<!--te-->

Expand Down Expand Up @@ -691,11 +692,11 @@ many.speak() # 方法名同,默认调用的是在括号中参数位置排前
# 我叫 man,我是一个演说家,我演讲的主题是 Python
```

## 重写时选择调用父类方法
## super 调用父类方法

在继承的类中,如果不管有没有重写了父类方法,当从子类的角度进行调用父类的方法时?该怎么办呢?

### 1. 子类内部使用
### 1. 子类内部标准使用

在子类内部,两种方式:

Expand Down Expand Up @@ -803,6 +804,100 @@ super(Student77, s).speak() # s作为子类(Student77)的对象,调用父类(
# stu77 说: 我 10 岁 重 60
```

### 3. 子类内部直接调用

Tiger 和 Whitetiger 类中主要讲解 super 的用法。

super 用于在子类中调用父类方法及属性,其实很多时候继承时 super 不是必要的,我们这了解一下这种用法。

例子

```python

class Tiger:
def __init__(self, name, age):
self.name = name
self.age = age

def eat(self):
return "[Tiger] I am eating"

def myname(self):
return "[Tiger] my name is " + self.name


class WhiteTiger(Tiger):
def __init__(self, name, age, height):
# 1 处让子类中可以调用父类的属性,其实就相当于运行父类的_init_函数。

# 标准引用 (standard call)
# 如果没有#1,则实例无法调用name属性;也无法调用realname方法,因为它用到了name属性,所以:需要初始化父类,这样就有了这些属性。
# super(WhiteTiger, self).__init__(name, age) # 1 (1-1) 调用父类初始化操作

#######
# #1处 除了上边方式,还有几种等价定义形式如下
#######

# 直接引用(hardwired call)
# 这种方式有个缺点: 不使用super而是直接用"父类名称",这样做的弊端是,如果"父类名称"改了,则所有这么用的位置都得改
# Tiger.__init__(self, name, age) # (1-2) 也可以调用父类初始化操作

# 间接引用(indirected call)
# 直接用super()简化写法,这是python3中才有的用法
# Python3.x 和 Python2.x 的一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx
super().__init__(name, age) # (1-3) 也可以调用父类初始化操作, self不用传入(自动传入)
# super().__init__(self, name, age) # 报错: TypeError: __init__() takes 3 positional arguments but 4 were given

self.height = height

def eatmore(self):
# 此处用super调用父类的eat方法,但实际上用self.eat调用就可以了,但如果要在Whitetiger中再定义一个eat方法,其中
# 要调用父类的eat方法,则必须用super,如下所示
return "[WhiteTiger] more " + self.eat() # 2 这里子类未重写eat(), 所以继承了父类eat(), 直接调用就可以调用父类eat
# 也可以使用 super
# return "[WhiteTiger] more " + super(WhiteTiger, self).eat() #2 调用父类eat

def realname(self):
return "[WhiteTiger] Actually " + super(WhiteTiger, self).myname() # 调用父类myname


wtony = WhiteTiger("Tony", 10, 100)

print(wtony.eat())
print(wtony.myname())

print(wtony.eatmore())
print(wtony.realname())


# [Tiger] I am eating
# [Tiger] my name is Tony
# [WhiteTiger] more [Tiger] I am eating
# [WhiteTiger] Actually [Tiger] my name is Tony
```

### 4. 总结和例子

参考更多例子来理解就好。

- [例子 -1](./examples/1.md)

## 多继承 (MRO)、super 调用顺序

MRO (Method Resolution Order) 要想理解多继承,首先需要搞懂 MRO 的概念。

从名字上来看,它表示方法解析的顺序。

更具体地说,python 中**每一个类都有一个对应的 MRO 元组**,元组里面存储着在调用该类的方法时,**解析器的查找顺序**

- 可以通过`type.__mro__`来查看任意一个类的 MRO

- 一旦在某个类中匹配到对应的方法,则停止查找

例子:

- [例子 -2](./examples/2.md)

# 多态

## 什么是多态
Expand Down Expand Up @@ -868,7 +963,7 @@ printUserInfo(userGeneral)
# Hello ! 尊敬的用户:水水水
```

# 常用方法
# 其他

## 如何判断是什么类型?是否是谁的子类

Expand Down
41 changes: 32 additions & 9 deletions seed/02-base-基础语法/examples/1.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
<!--ts-->

- [理解:类和对象操作、property 装饰器、私有属性、继承](#理解类和对象操作property-装饰器私有属性继承)
- [类和对象操作、property 装饰器、私有属性、继承、super 调用](#类和对象操作property-装饰器私有属性继承super-调用)
- [Animal (入门)](#animal-入门)
- [Dog (属性 | 通过方法封装实现)](#dog-属性--通过方法封装实现)
- [Cat (私有属性、继承)](#cat-私有属性继承)
- [Tiger (子调用父类方法](#tiger-子调用父类方法)
- [Tiger (super 调用父类方法](#tiger-super-调用父类方法)

<!-- Added by: edy, at: 2023年 3月17日 星期五 12时48分47秒 CST -->
<!-- Added by: edy, at: 2023年 3月20日 星期一 10时48分37秒 CST -->

<!--te-->

# 理解:类和对象操作、property 装饰器、私有属性、继承
# 类和对象操作、property 装饰器、私有属性、继承、super 调用

[参考](https://zhuanlan.zhihu.com/p/31160361)

Expand Down Expand Up @@ -402,11 +402,11 @@ cain.print_cat()
# 在子类中实现和父类同名的方法,也会把父类的方法覆盖掉
```

## Tiger (子调用父类方法
## Tiger (super 调用父类方法

Tiger 和 Whitetiger类中主要讲解super的用法
Tiger 和 Whitetiger 类中主要讲解 super 的用法

super用于在子类中调用父类方法及属性,其实很多时候继承时super不是必要的,我们这里只简单了解一下这种用法。
super 用于在子类中调用父类方法及属性,其实很多时候继承时 super 不是必要的,我们这里只简单了解一下这种用法。

例子

Expand All @@ -425,11 +425,34 @@ class Tiger:

class WhiteTiger(Tiger):
def __init__(self, name, age, height):
super(WhiteTiger, self).__init__(name, age) # 调用父类初始化操作
# 1 处让子类中可以调用父类的属性,其实就相当于运行父类的_init_函数。

# 标准引用 (standard call)
# 如果没有#1,则实例无法调用name属性;也无法调用realname方法,因为它用到了name属性,所以:需要初始化父类,这样就有了这些属性。
# super(WhiteTiger, self).__init__(name, age) # 1 (1-1) 调用父类初始化操作

#######
# #1处 除了上边方式,还有几种等价定义形式如下
#######

# 直接引用(hardwired call)
# 这种方式有个缺点: 不使用super而是直接用"父类名称",这样做的弊端是,如果"父类名称"改了,则所有这么用的位置都得改
# Tiger.__init__(self, name, age) # (1-2) 也可以调用父类初始化操作

# 间接引用(indirected call)
# 直接用super()简化写法,这是python3中才有的用法
# Python3.x 和 Python2.x 的一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx
super().__init__(name, age) # (1-3) 也可以调用父类初始化操作, self不用传入(自动传入)
# super().__init__(self, name, age) # 报错: TypeError: __init__() takes 3 positional arguments but 4 were given

self.height = height

def eatmore(self):
return "[WhiteTiger] more " + super(WhiteTiger, self).eat() # 调用父类eat
# 此处用super调用父类的eat方法,但实际上用self.eat调用就可以了,但如果要在Whitetiger中再定义一个eat方法,其中
# 要调用父类的eat方法,则必须用super,如下所示
return "[WhiteTiger] more " + self.eat() # 2 这里子类未重写eat(), 所以继承了父类eat(), 直接调用就可以调用父类eat
# 也可以使用 super
# return "[WhiteTiger] more " + super(WhiteTiger, self).eat() #2 调用父类eat

def realname(self):
return "[WhiteTiger] Actually " + super(WhiteTiger, self).myname() # 调用父类myname
Expand Down
Loading

0 comments on commit 34bb431

Please sign in to comment.