與java類似,繼承的出現是為了提高代碼的重覆利用率,避免多次輸入同樣的代碼。而超類就是java中的父類。 # 1.繼承 要指定超類,可在定義類時,在class語句中的類名後加上超類名 * 基類就是超類,派生類就是子類 格式 ``` class Dog: # pass class Bobo(Dog) ...
與java類似,繼承的出現是為了提高代碼的重覆利用率,避免多次輸入同樣的代碼。而超類就是java中的父類。
1.繼承
要指定超類,可在定義類時,在class語句中的類名後加上超類名
- 基類就是超類,派生類就是子類
格式
class Dog: #
pass
class Bobo(Dog): # Dog類的子類
pass
子類會
- 重新定義重寫超類方法init
- 繼承超類的方法,無需再次編寫
class Dog:
def __init__(self):
print('wang!!!')
def eat(self):
print('Dog is eating.')
class Bobo(Dog): # 繼承Dog
pass
tom = Bobo()
tom.eat()
>
wang!!!
Dog is eating.
在子類中進行重寫
class Dog:
def __init__(self):
print('wang!!!')
def eat(self):
print('Dog is eating.')
class Bobo(Dog):
def __init__(self):
print('Bobo is wang!')
def eat(self):
print('Bobo is eating.')
tom = Bobo()
tom.eat()
>
Bobo is wang!
Bobo is eating.
1.1查找一個類的子類和基類
issubclass
確定一個類是否是另一個類的子類
issubclass(Bobo, Dog) # 子類 超類
> True
issubclass(Dog, Bobo)
> False
- 已知一個類,想知道它的基類,訪問特殊屬性
__bases__
print(Bobo.__bases__)
> (<class '__main__.Dog'>,)
-
isinstance
確定創建的對象是否是特定類的實例創建子類的實例,這個對象同時也是其基類的實例
class Dog:
pass
class Bobo(Dog):
pass
tom = Bobo()
print(isinstance(tom, Bobo))
print(isinstance(tom, Dog))
>
True
True
- 使用屬性
__class__
可以知道該實例屬於哪個類
print(tom.__class__)
> <class '__main__.Bobo'>
1.2 多個超類
儘量避免使用
格式
class A:
pass
class B:
pass
class C(A, B): # 同時繼承A和B
pass
1.3介面
介面這一概念與多態相關。實際上,python中沒有與java相對應的介面。需要特定的模塊來實現
1.4 抽象基類
抽象類不能(不應該)被實例化,用於定義子類應該實現的一些抽象方法。
格式
from abc import ABC, abstractmethod
class 類名(ABC): # 繼承ABC類
@abstractmethod # 標記為抽象方法,在子類中必須實現
def 方法名(self):
pass
from abc import ABC, abstractmethod
class Dog(ABC):
@abstractmethod
def eat(self):
pass
class Bobo(Dog):
def eat(self):
print('eating.')
tom = Bobo()
tom.eat()
> eating.