何継承されています
プロ角:Bは、Bが親B、ベースクラス、BクラスとスーパーオブジェクトクラスBがクラスAの属性およびメソッドのすべてを使用すると呼ばれるAのサブクラス、派生クラス、A、と呼ばれ、クラスAを継承
文字通り:継承は、親のすべての資産を継承することです
class Person:
def __init__(self,name,sex,age):
self.name = name
self.age = age
self.sex = sex
class Dog:
def __init__(self,name,sex,age):
self.name = name
self.age = age
self.sex = sex
class Cat:
def __init__(self,name,sex,age):
self.name = name
self.age = age
self.sex = sex
継承利点(使用)
- コードを保存し、繰り返しのコードを減らします
- 強化カップリング(すなわち、拡張コードの読みやすさ)
- コードはより標準化してください
- サブクラスは、親クラスのすべてのプロパティを呼び出すことができます
三つの上記で定義されたカテゴリ、ヒト、イヌ、ネコ、上記のコードが重複したコードをたくさん持っていることが判明し、3クラスが同じ属性を持っている、動物のクラスを再定義し、一緒にコードを繰り返す必要があり、あなたは削除することができますコードは、これは次のように変更され
継承の使用
class Animal:
live = '有生命的'
def __init__(sefl, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print('动物都需要进食')
class Person(Animal): # 括号中Animal就是父类
pass
class Dog(Animal): # 括号中的Animal就是父类
pass
class Cat(Animal): # 括号中的Animal就是父类
pass
# 类名后面括号中传入的参数就是父类
# 1. 从类名执行父类的属性
先打印一下Person类中所有的属性
print(Person.__dict__) #输出结果:{'name': '小胖', 'age': 18, 'sex': '男'}
print(Persion.live) # 输出结果:有生命的
# 2. 类名可以执行父类的方法
Person.eat(555)
# 3. 从对象执行父类的一切
实例化对象一定会执行三件事.一定会执行__init__
p1 = Person('dsb', 21, 'boy')
print(p1.__dict__)
print(p1.live)
p1.eat()
print(f'p1 ---> {p1}')
# 注意: 子类以及子类对象只能调用父类的属性以及方法,不能操作(增删改).
継承された分類
単一継承
多重継承
人犬猫:と呼ばれるサブクラスまたは派生クラス
動物:スーパークラス、基底クラス、親クラスと呼ばれています
単一継承の使用
class Aniaml(object):
live = '有生命的'
def __init__(self,name,sex,age):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print(f'self ---> {self}')
print('吃东西')
class Person(Aniaml):
def eat(self):
print('人类需要进食')
class Cat(Aniaml):
pass
class Dog(Aniaml):
pass
p1 = Person('dsb', 21, 'boy')
p1.eat()
# 输出结果
人类需要进食
# 说明一个问题: 子类将父类的方法,覆盖了,(重写父类的方法) 查找位置
# 对象查找顺序,先从对象空间找名字,子类找名字,父类找名字
方法一: 第三个继承
人类的不同于其他狗类和猫类的特性
如何既要执行父类方法又要执行子类方法
class Aniaml(object):
live = '有生命的'
def __init__(self,name,sex,age):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print(f'self ---> {self}')
print('吃东西')
class Person(Aniaml):
def eat(self):
print('人类需要进食')
def __init__(self,name, age, sex, hobby):
Aniaml.__init__(self, name, age, sex) # 关键点,手动的把对象空间传给self,但是()中需要接收参数
self.hobby = hobby
class Cat(Aniaml):
pass
class Dog(Aniaml):
pass
# 正常子类有__init__就不执行父类的__init__,现在的目的既要执行父类方法又要执行子类方法
p1 = Person('催牛逼') # 这里的传参方法:p1 = Person('对对哥', 23, '不详','吹牛逼')
print(p1.__dict__)
# 方法二
class Aniaml(object):
live = '有生命的'
def __init__(self, name, sex, age):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print(f'self ---> {self}')
print('吃东西')
class Person(Aniaml):
def eat(self):
print('人类需要进食')
def __init__(self, name, age, sex, hobby):
super(Person, self).__init__(name,age,sex) # 关键点
# 简写成super().__init__(name, age, sex) # 使用了父类的init
self.hobby = hobby
class Cat(Aniaml):
pass
class Dog(Aniaml):
pass
# 正常子类有__init__就不执行父类的__init__,现在的目的既要执行父类方法又要执行子类方法
p1 = Person('对对哥', 23, '不详', '吹牛逼')
print(p1.__dict__)
文章の要約
単一継承は、コード、共通の親の定義を保存するように設計されていますが、同じ親クラスのメソッドをサブクラスに存在する場合、親クラスのサブクラスのメソッドが検索でオブジェクト名によって上書きされますときに最初重いオブジェクト・スペース名の検索、直接の引用がある場合、それは親クラスの名前空間から検索を継続しない場合は、サブクラス空間から名前を見つけるために、継続しない場合
多重継承の使用
class God:
def __init__(self, name):
self.name = name
def fly(self):
print('会飞')
def climb(self):
print('神仙累了也需要爬树')
class Monkey:
def __init__(self,sex):
self.sex = sex
def climb(self):
print('爬树')
class MonkeySun(God,Monkey): # 继承了2个类,孙猴子既是神仙又是猴子
pass
# 多继承的难点就是继承顺序的问题
# 现在执行的时候是先执行神仙的还是先执行猴子的呢?
这里面就涉及到单进程与多进程的分类:
面向对象:
python2.2之前都是经典类
python2.2之后到python2.7之间存在2种类型:经典类,新式类.区别:经典类是基类,不继承object,它的查询规则,依靠的是深度优先的原则,
python3x之后新式类,新式类必须继承object,查询规则是mro算法,在多进程的时候查询顺序不同
多重継承と単一継承差
単一継承は、親クラス、複数の親クラス、多重継承の問題が発生し、この時間を継承するために多重継承の必要性を継承であることの終わりに最初の実行の親クラスのメソッドである親クラスを、継承した後継者問題、の順
難易度の多重継承:継承問題の順序
クラシック深さの検索順序
原理は:古典的なカテゴリに深さ優先探索を使用して記録されている⽅場合深さ、最初の方法は何が最初に来ると、レコードの次のものを見つけるために戻ってくる⼀です....
多重継承の新しいクラス
MROアルゴリズム
ユニバーサル計算
mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] )
例
mro(Foo(H,G)) = [Foo] + merge(mro(H), mro(G),[H,G])
ヘッダー:
リストの最初の要素
フッター:
テーブルヘッドのリスト以外の要素のコレクション(エピトープが空の場合もあります)
ヘッダー、エピトープ
[A、B、C]ヘッダ[B、C]フッター
[A]:ヘッダー:フッター:[]
クラスの4つの新しい計算方法の作業
例
'''
class O:
pass
class D(O):
pass
class E(O):
pass
class F(O):
pass
class B(D,E):
pass
class C(E,F):
pass
class A(B,C):
pass
# a = A()
# a.func()
'''
'''
mro(A) = mro(A(B,C))
= [A] + merge(mro(B), mro(C), [B,C])
mro(B) = mro(B(D,E))
= [B] + merge(mro(D), mro(E), [D,E])
= [B] + merge([D,O], [E,O], [D,E])
= [B,D] + merge([O], [E,O], [E])
= [B,D,E,O]
mro(C) = mro(C(E,F))
= [C] + merge(mro(E), mro(F),[E,F])
= [C] + merge([E,O],[F,O],[E,F])
= [C,E] + merge([O],[F,O],[F])
= [C,E,F,O]
mro(A) = mro(A(B,C))
= [A] + merge([B,D,E,O], [C,E,F,O], [B,C])
= [A,B] + merge([D,E,O], [C,E,F,O], [C])
= [A,B,D] + merge([E,O], [C,E,F,O], [C])
= [A,B,D,C] + merge([E,O], [E,F,O])
= [A,B,D,C,E] + merge([O], [F,O])
= [A,B,D,C,E,F,O]