1.什麼是繼承?
讓子類直接擁有父類的屬性和方法的過程就是繼承
父類 - 被繼承者(在其他語言裡也有的叫做超類)
子類 - 繼承者
2.怎麼繼承?
語法:
class 類名(父類1,父類2..
..) 類的說明文件
類的內容
注意:預設情況下,定義的類繼承自object
下面寫段簡單的**看看繼承的實現:
class
person
: num =
61def
__init__
(self)
:print
('person中init'
) self.name =
'小明'
self.age =
18 self.gender =
'男' self.__*** =
'女'def
eat(self)
:print
(f'person:在吃飯'
) @classmethod
defshow_num
(cls)
:print
(f'人類的數量:'
) @staticmethod
deffunc1()
:print
('人類破壞環境!'
)# 讓 student(子類) 繼承 person(父類)
class
student
(person)
:pass
# 繼承的時候子類可以直接擁有父類所有的屬性和方法
print
(student.num)
# 用子類獲取到父類的類屬性 61
stu = student(
)print
(stu.name, stu.age, stu.gender)
# 小明 18 男 子類的物件擁有父類的屬性
stu.eat(
)# 子類的物件呼叫父類方法
student.show_num(
)# 子類呼叫父類方法
student.func1(
)# 子類呼叫父類的靜態方法
print
(stu.__dict__)
# 這裡私有屬性一樣會繼承
3.在子類中新增內容
①在子類中新增類屬性和方法
類屬性和方法的新增不會因為繼承而受到影響
②新增物件屬性
物件屬性是怎麼被繼承:繼承的時候因為init方法被繼承,間接繼承了物件屬性
在子類的__init__
方法中通過super()
去呼叫父類的__init__
方法
補充:類中的方法的呼叫過程(重要)
通過類或者物件在呼叫方法的時候,會先看當前類中有沒有這個方法,如果有就直接呼叫自己類中的方法;沒有就看父類中有沒有定義這個方法,如果父類定義了就呼叫父類的;父類沒有定義,就看父類的父類中有沒有定義…以此類推,如果 object 中沒有定義才會報錯!
運算子過載
python中使用每乙個運算子其本質都是在呼叫運算子對應的方法(每個運算子都會對應乙個固定的方法)。某種型別的資料支不支援某個運算子,就看這個資料對應的型別中有沒有實現運算子對應的方法,下面舉例看一下實現python實現運算的方法
10+20
# 其實就是呼叫 10.__add__(20)
'abc'
+'123'
# 'abc'.__add__('123')
100-
10# 100.__sub__(10)
下面寫段簡單的**來實現一些簡單的功能
from copy import copy
class
person
:def
__init__
(self, name=
'', age=0)
: self.name = name
self.age = age
# +def__add__
(self, other)
:# self + other
return self.age + other.age # 這裡重寫了__add__方法,使我們在呼叫物件相加時,返回值是年齡相加的值,否則物件跟物件之間是不能做加減乘除的
# *def
__mul__
(self, other)
: list1 =
for _ in
range
(other):)
return list1 # 重寫了__mul__方法
# <
# 注意:大於符號和小於符號實現其中乙個另外乙個也可以用
def__lt__
(self, other)
:return self.age < other.age # 重寫了小於__lt__方法,我們在用sort排序時,會比較物件的年齡來排序,否則也會報錯
def__repr__
(self)
:return f'<>'
p1 = person(
'小明'
, age=18)
p2 = person(age=30)
print
(p1 + p2)
# p1.__add__(p2)
print
(p1 *3)
# [<'name': '小明', 'age': 18>, <'name': '小明', 'age': 18>, <'name': '小明', 'age': 18>]
persons =
[person(
'小花',20
), person(
'tom',18
), person(
'張三',28
), person(
'李四',15
)]persons.sort(
)print
(persons)
# [<'name': '李四', 'age': 15>, <'name': 'tom', 'age': 18>, <'name': '小花', 'age': 20>, <'name': '張三', 'age': 28>]
單例模式即乙個類有且僅有乙個例項,在python中,乙個類建立物件例項是通過呼叫父類object
的__new__(cls)
方法來建立物件的。我們可以通過重寫__new__(cls)
方法去實現單例模式。
class
person
: __obj =
none
# 定義乙個類屬性做判斷
def__new__
(cls,
*args,
**kwargs):if
not cls.__obj:
# 如果_obj為空證明是第一次建立的例項
cls.__obj =
super()
.__new__(cls)
# 通過父類建立例項
return cls.__obj # 返回類屬性,保證下一次再呼叫時,_obj就不為空了
def__init__
(self)
:print
('init:'
, self)
p1 = person(
)p2 = person(
)print
(p1 is p2)
# true
python基礎 面對物件特性
1 封裝特性 2 繼承特性 3 多型 封裝 將類中的某些部分隱藏起來,物件不能直接使用隱藏起來的屬性和方法,具有保護功能。封裝格式 雙下劃線屬性或者方法名稱。繼承 讓類和類之間產生父子關係,子類可以擁有父類的靜態屬性和方法。python中繼承分為單繼承和多繼承。繼承的作用 提高 的重複率。格式 雙下...
python 面對物件 繼承
私有屬性和方法通過在屬性和方法名前新增 得到。私有屬性和方法是物件的隱私,不能通過外界和子類直接訪問 在外界無法訪問到私有屬性和方法 不能直接print列印 可以通過在物件的方法內部訪問私有屬性 子類物件可以通過父類的公有方法間接訪問到私有屬性或私有方法 eg classa def init sel...
python 面對物件 類
一.類體 類體一般有兩部分組成 變數部分,也叫靜態變數,靜態欄位.方法 函式 部分.class person 類體 兩部分 變數部分,方法 函式 部分 mind 有思想 變數,靜態變數,靜態字段 animal 高階動物 faith 有信仰 def init self,name,age,hobby s...