關於本文代碼中的self的含義,大家可參考下面這篇博文:
https://blog.csdn.net/wenhao_ir/article/details/125384347
class Fruit:
color = 'red'
def taste(self):
return 'delicious'
apple = Fruit()
a_character = apple.color
b_character = apple.taste()
print('\na_character:{}'.format(a_character))
print('b_character:{}'.format(b_character))
運行結果如下圖所示:
class Staff: # Staff為員工的意思
bonus = 30000 # bonus為津貼、獎金的意思
def salary(self): # salary為工資的意思
salary = 10000+self.bonus
return salary
zhang_san = Staff()
zhang_san_salray = zhang_san.salary()
運行結果如下所示:
class Staff: # Staff為員工的意思
def __init__(self, bonus): # bonus為津貼、獎金的意思
self.bonus = bonus
def salary(self): # salary為工資的意思
salary = 10000+self.bonus
return salary
zhang_san = Staff(3000)
zhang_san_salray = zhang_san.salary()
運行結果如下:
class AnimalBaseClass:
def __init__(self, num):
self.animallegs = num
self.head_num = 0
def walk(self):
print('走')
def cry(self):
print('叫')
def get_legs_num(self):
print(self.animallegs)
def input_head_num(self, num2):
self.head_num = num2
def get_head_num(self):
print(self.head_num)
animal = AnimalBaseClass(4)
animal.input_head_num(1)
animal.get_legs_num()
animal.get_head_num()
上面的代碼中,成員函數input_head_num()是帶了參數的。
運行結果如下:
class AnimalBaseClass:
def __init__(self, num):
self.animallegs = num
def walk(self):
print('走')
def cry(self):
print('叫')
def get_legs_num(self):
print(self.animallegs)
class BirdClass(AnimalBaseClass):
head_num = 1
def cry(self):
print('吱吱叫')
def run(self):
print('跑')
def get_head_num(self):
print(self.head_num)
piyo_suke = BirdClass(2)
piyo_suke.cry()
piyo_suke.run()
piyo_suke.get_legs_num()
piyo_suke.get_head_num()
在上面的代碼中,類BirdClass繼承於類AnimalBaseClass,它擁有類AnimalBaseClass的變量和成員函數。
運行結果如下:
當父類和子類都擁有同樣名稱的成員函數時,子類調用這個成員函數時會優先調用子類中成員函數,這個功能叫重寫(覆蓋),英文中的叫法叫“override”所以上面的代碼中語句
piyo_suke.cry()
的運行結果為“吱吱叫”,而不是“叫”。
不僅是一般的成員函數能被改寫,構造函數也可以在子類中重寫,比如下面的代碼:
class AnimalBaseClass:
def __init__(self, num):
self.animallegs = num
def walk(self):
print('走')
def cry(self):
print('叫')
def get_legs_num(self):
print(self.animallegs)
class BirdClass(AnimalBaseClass):
def __init__(self, num1, num2):
self.animallegs = num1
self.head_num = num2
def cry(self):
print('吱吱叫')
def run(self):
print('跑')
def get_head_num(self):
print(self.head_num)
piyo_suke = BirdClass(3, 1)
piyo_suke.cry()
piyo_suke.run()
piyo_suke.get_legs_num()
piyo_suke.get_head_num()
上面的代碼中,子類BirdClass的構造函數和父類AnimalBaseClass不一樣。
運行結果如下:
要注意,你的代碼中用到了哪些成員變量,你在構造函數就要注意把它初始化,否則調用時會出錯,比如下面這樣寫就不行:
class BirdClass(AnimalBaseClass):
def __init__(self, num2):
self.head_num = num2
def cry(self):
print('吱吱叫')
def run(self):
print('跑')
def get_head_num(self):
print(self.head_num)
piyo_suke = BirdClass(1)
piyo_suke.cry()
piyo_suke.run()
piyo_suke.get_legs_num()
piyo_suke.get_head_num()
上面的代碼中,成員函數get_legs_num()用到了成員變量animallegs,但是沒有進行初始化,所以在調用語句piyo_suke.get_legs_num()時會報下面這樣的錯:
在代碼的書寫格式上注意以下幾點(非必須,但是這樣書寫出來的代碼漂亮好看且規范):