python学习(10)继承、多态、实战

继承

一、Java与Python的继承区别:

1、Python是一个类可以继承N个类

2、Java只能继承一个类

 

二、概念:

1、基类(父类):被继承的类

2、派生类(子类):继承其他类的类

 

  • 如果一个类没有继承任何类,则默认继承object

  • Python支持多继承

  • 定义子类时,必须在其构造函数中调用父类的构造函数

三、格式:

class    子类类名(父类):
  (构造方法中调用父类的构造方法)

 

四、子类继承父类,继承了什么?

继承了父类的:(数据属性、实例属性、方法)

1、数据属性

2、实例属性

方法1:  super().__init__(name,age)       
方法2: 父类名.__init__(self,name,age)

 

3、方法

在子类中调用父类的方法,因为要用到这个方法里的内容,子类调用后对这个方法要进行重写(或者说要对这个方法进行运用),所以这个父类方法要有return返回值。

 

五、方法重写:

当父类的方法没有办法满足子类的需求的时候,那么子类就会重写了父类的方法。

 

六、继承的原则:

(简单来说,从左到右、从上到下的实践方法其实也是遵循的MRO原理,是从mro中总结出来的,根本上的顺序就是mro的输出结果。说白了就是先找自己、再从左到右找(因为是线性查找,自己重写了父类的方法就从自己这儿找到了,自己没重写的话,就是从左到右找)。

原理:

在Python中,基于MRO的解析顺序规则,就会从左到右开始查找基类,如果找到第一个匹配的属性类,就会停止查找,如果没有,那么就继续查找,直到查找到如何要求的为止。MRO其实就是通过一个C3线性化算法来实现的,它的核心思想为:

1、子类会优先于父类检查

2、多个父类会根据它们在列表中的顺序被依次检查(如下图mro输出的列表,也就是从左到右)

3、如果对下一个类存在两个合法的选择,只能选择第一个

 

 

实践:

1、从左到右

(父类中写在左边的,优先于写在右边的,如下图的Father优先于Mother)

前提条件:子类没重写父类的方法

原则:线性查找的顺序规则,也就是说调用方法,如果找到第一个满足的方法,后面继承的类即使有这个方法,也不会调用。

 1 class Father(object):
 2     def __init__(self,salary):
 3         self.salary=salary
 4 
 5     @property
 6     def getSalary(self):
 7         return self.salary
 8 
 9     def show(self):
10         print("男人赚钱")
11 
12 class Mother(object):
13     def __init__(self,hobby):
14         self.hobby=hobby
15     def show(self):
16         print("女人花钱")
17 
18 class Son(Father,Mother):
19     def __init__(self,salary,hobby):
20         Father.__init__(self,salary)
21         Mother.__init__(self,hobby)
22 
23 obj=Son(salary=10,hobby="读书")
24 # obj.show()
25 print(Son.mro())
View Code

 

2、从下到上

前提条件:子类重写了父类的方法。

原则:线性查找的顺序规则,调用父类以及子类共同拥有的方法的时候,优先调用子类自己写的方法。

 

 1 class Animal(object):
 2     address="地球"
 3 
 4     def __init__(self,name,age):
 5         self.name=name
 6         self.age=age
 7 
 8     def show(self):
 9         return "name is {0},age is {1}".format(self.name,self.age)
10 
11 class Person(Animal):
12     def __init__(self,name,age,work):
13         super().__init__(name,age)        #子类继承父类的实例属性 方式1
14         Animal.__init__(self,name,age)    #子类继承父类的实例属性 方式2
15         self.work=work
16 
17     def info(self):
18         print("来自{0},信息:{1}".format(self.address,self.show()))
19 
20     def show(self):
21         print("我我我我")
22 
23 obj=Person(name="j",age=18,work="测试")
24 obj.show()
View Code

 

 报错:

 

 

多态

多态的优势具体可以总结为如下几点,具体为:

  • 增加了持续的灵活性

  • 增加了持续的额外扩展的功能

一、主函数:

主函数(统一执行程序)下可以执行函数或方法,敲main就会出来:

使用:

二、多态:万物皆可对象

func函数定义了这个方法,给函数赋值,值属于哪一类中,就调用哪个方法

 

oop实战:

oop:面向对象

 

 1 import json
 2 import sys
 3 
 4 class Stack(object):
 5     def out(self):
 6         username=input("请输入你的账户:\n")
 7         password=input("请输入你的密码:\n")
 8         return username,password                 #类似封装,在下面调用就行,下面的代码会更简洁
 9 
10     def register(self):
11         username,password=self.out()
12         temp=username+","+password
13         json.dump(temp,open("data.txt","w"))           #文件序列化:相当于下面两行代码(把内容写入文件)
14         # with open("data.txt","w") as f:
15         #     f.write(temp)
16 
17     def login(self):
18         username, password=self.out()
19         lists=str(json.load(open("data.txt"))).split(",")   #文件反序列化:相当于下面两行代码
20         # with open("data.txt","r") as f:
21         #     lists=f.read().split(",")
22         if username==lists[0] and password==lists[1]:
23             print( "恭喜你,登录成功!")
24         else:
25             print( "请输入正确的用户名和密码")
26 
27     def profile(self):
28         with open("data.txt","r") as f:
29             lists=f.read().split(",")
30             print("欢迎{0}访问主页".format(lists[0]))
31 
32     def exit(self):
33         sys.exit(1)
34 
35     def main(self):
36         while True:
37             try:
38                 f=int(input("1、注册 2、登录 3、主页 4、退出\n"))
39                 if f==1:
40                     self.register()
41                 elif f==2:
42                     self.login()
43                 elif f==3:
44                     self.profile()
45                 elif f==4:
46                     self.exit()
47                 else:continue
48             except Exception as e:continue
49 
50 if __name__ == '__main__':
51     obj=Stack()
52     obj.main()
View Code

 

posted @ 2022-04-02 16:55  jia---  阅读(153)  评论(0)    收藏  举报