Day7 类的继承和继承实现的原理
2024-09-03 13:20:50
继承可以分为但继承,多继承。
继承的基本形式
class ParentClass1(object): #定义父类
pass class ParentClass2: #定义父类
pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
pass class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
pass print(SubClass1.__bases__) #显示他继承了几类
print(SubClass2.__bases__)
print(ParentClass1.__bases__)
经典类和新式类:
两者区别在python3中是没有区别的,都有有个继承,如果没定义继承,也会默认将object继承,都叫新式类。
两者的区别在python2才有区别,没有定义就是经典类,如果定义了继承就是新式类。
class Animal:
x=1
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
# print('Animal.__init__')
def eat(self):
print('%s eat' %self.name) def talk(self):
print('%s say' %self.name) class People(Animal):
x=10
def __init__(self,name,age,sex,education):
Animal.__init__(self,name,age,sex)
self.education=education
# print('People.__init__') def talk(self):
Animal.talk(self)
print('这是人在说话') class Dog(Animal):
pass
class Pig(Animal):
pass peo1=People('alex',18,'male','小学肄业')
print(peo1.__dict__)
peo1.talk()
print(peo1.x) dog1=Dog('yuanhao',28,'male')
pig1=Pig('wupeiqi',18,'male') print(peo1.name)
print(dog1.name)
print(pig1.name)
类的继承:
class OldboyPeople:
school = 'oldboy'
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex def eat(self):
print('is eating') class OldboyStudent(OldboyPeople):
def learn(self):
print('%s is learning' %self.name) class OldboyTeacher(OldboyPeople):
def __init__(self,name,age,sex,salary,title):
OldboyPeople.__init__(self,name,age,sex)
self.salary=salary
self.title=title def teach(self):
print('%s is teaching' %self.name) yl_obj=OldboyStudent('yanglei',28,'female')
egon_obj=OldboyTeacher('egon',18,'male',3.1,'沙河霸道金牌讲师')
总结;
1,继承功能之一:解决类与类之间代码重复
2,继承是类与类之间的关系,是一种,什么是什么的关系
3,在子类派生出新的属性,以自己的为准。
4,在子类派生出新的方法内重用弗雷的功能的方式:指名道姓
eg:OldboyPeople.__init__
这种调用方法本身跟继承没有关系
继承实现的原理:
调用顺序:
单继承的话:如果执行的话先找自己的范围内,当没有的时候再去找父类。(就是不管怎么找,都是先从自身找齐)
#单继承
class A:
def f1(self):
print('A.f1') def f2(self):
print('A.f2')
self.f1() #b.f1() class B(A):
def f1(self):
print('B.f2') b=B()
# b.f2=111111
b.f2()
多继承的话:
#多继承
class J:
def test(self):
print('J')
class A(J):
# def test(self):
# print('A')
pass
class E(J):
def test(self):
print('E')
pass
class H(J):
def test(self):
print('H') class G(H):
def test(self):
print('G')
pass
class B(A):
# def test(self):
# print('B')
pass
class D(E):
def test(self):
print('D')
pass
class F(G):
def test(self):
print('F')
pass
class C(B,D,F):
# def test(self):
# print('C')
pass c=C()
# c.test=1111
c.test()
#可以利用*.mro()来查看他的调用顺序
eg: print(c.mro())
最新文章
- 一份关于Swift语言学习资源的整理文件
- Prestashop 页面空白
- air手势代码
- c++中智能输出文件
- ERROR 1227 (42000): Access denied; you need (at least one of) the PROCESS privilege(s) for this oper
- [swustoj 404] 最小代价树
- Linq to Sql自动生成实体类重名情况的处理
- PL/SQL 游标的使用
- innerHTML使用方法
- httpd2.2配置文件详解
- redis主从复制入门案例
- 清橙A1202&;Bzoj2201:彩色圆环
- UmengShareDemo【友盟分享SDK集成,基于V6.9.3版本】
- fuzzing学习
- Notepad++的实用技巧
- Oracle创建表空间、用户管理、角色管理
- db2 merge update
- java使用代理请求https
- 11.12git部分和redis
- 4星|《门口的野蛮人2》:美国宝万之争专业户KKR公司的疯狂借债收购史