21 Python 面對物件 基礎 下

2021-10-07 20:58:53 字數 3878 閱讀 3285

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...