Day 15 物件導向2

2021-10-25 06:37:08 字數 4147 閱讀 4408

day 15

物件屬性操作

語法:

1)物件.屬性名 - 屬性名不存在時會報錯

2)getattr.(物件,『屬性名』) - 注意:屬性名要用』'引起來;在屬性名後面加乙個引數表示預設值,在屬性名不存在時返回預設值

語法:

1)物件.屬性名 = 值 - 屬性名存在時會修改;屬性值不存在時會新增

2)setattr(物件,『屬性名』,值) - 同上

語法:

1)del 物件 - 刪除物件

2)del 物件.屬性名 - 刪除物件屬性

3)delattr(物件,『屬性名』) - 刪除物件屬性

類方法和靜態方法

類方法

在定義函式前加乙個@classmethod裝飾器

類.方法名(),預設引數cls,這個引數在呼叫時不用傳參,系統會自動將當前類傳給cls;cls類似物件方法中的引數self,類具有的功能引數cls都具有

實現函式功能在不需要物件屬性的前提下需要使用類,定義函式時使用類方法

靜態方法
在定義函式前加乙個裝飾器@staticmethod

類.方法名(),沒有預設引數,相當於乙個普通函式

實現函式功能時既不需要物件也不需要使用類,定義函式時使用靜態方法

內建類屬性

print

(person.__doc__)

print

(str

.__doc__)

print

(person.__module__)

# __main__:表示類就在當前模組下

print

(list

.__module__)

# builtins:系統模組所在位置

print

(person.__name__)

# person

print(id

.__name__)

# id

print

(p1.__class__)

# print

(type

(p1))#

print

(person)

# 對比person.__name__

print

('a'

.__class__)

# print((

10).__class__)

# class

person

:"""

人類"""

num =

61def

__init__

(self, name=

none

, age=

none

, gander=

none):

self.name = name

self.age = age

self.gander = gander

defeat(self, food=

none):

print

(f'在吃'

) @classmethod

defmesssage

(cls)

:print

(f'人類目前的數量為:'

)p = person(

)print

(person.__dict__)

# 從結果來看,定義函式就是在定義變數(方法也是屬性)

print

(p.__dict__)

# 獲取物件的全部屬性

print

(dict

.__bases__)

getter和setter

getter

在獲取物件屬性之前如果需要其他操作,就給這個屬性新增getter

1.在需要新增getter的屬性的屬性名前加_

2.在@property裝飾器後面定義乙個函式(相當於定義乙個物件屬性)函式名就是屬性名去掉_,函式沒有其他引數,返回值為獲取這個屬性真正得到的結果

3.通過物件獲取屬性的時候,屬性不屬於帶_

lass circle:

pi =

3.1415926

def__init__

(self, radius=1)

: self.radius = radius

# self._area = circle.pi * (radius << 1)

@property

defarea

(self)

:return circle.pi *

(self.radius <<1)

c1 = circle(

)print

(c1.area)

c1.radius =

2print

(c1.area)

setter
如果要在給某個物件屬性賦值之前有其他操作,就給這個屬性新增setter,且在新增setter之前必須新增getter

1.在需要新增getter的屬性名前加-

2.在名為@新增getter的屬性名.setter的裝飾器後面定義乙個函式,函式名為新增getter的屬性名去掉_,函式有乙個引數(指向賦值時賦予的值),沒有返回值

3.最終目的是給屬性賦值,通過物件給屬性賦值時,屬性名不需要加_

class

personpro

:"""

年齡狀態

"""def__init__

(self, age=

none):

self._age = age

@property

defage

(self):if

0<= self._age <=4:

return

'兒童'

elif self._age <=12:

return

'少年'

elif self._age <=28:

return

'青年'

elif self._age <=40:

return

'壯年'

elif self._age <=55:

return

'中年'

else

:return

'老年'

@age.setter

defage(self, value)

:print

(f'value:')if

type

(value)

!=int

:raise typeerror

if value <

0or value >

220:

raise valueerror

self._age = value

p2 = personpro(

)p2.age =

300print

(p2.age)

私有化

訪問許可權

python對許可權的管理

python中所有的屬性和方法只有公開的;所謂的私有化其實是偽私有,僅僅只是乙個私有宣告

私有化方法
在屬性名和方法名前加__(注意:只需要兩個下劃線開頭,不需要結尾)

運算子過載
python在使用運算子時實質實在呼叫運算子對應的魔法方法

每個運算子對應的方法的方法名是固定的

不同型別資料在參與相同運算子的運算時,運算子呼叫的方法是不同的

某個型別的資料是否支援某種運算就看這個資料對應的型別中有沒有實現這個運算子對應給功能

Day 15 物件導向2習題

建立乙個汽車類auto,包括輪胎個數,汽車顏色,車身重量,速度等屬性,並通過不同的構造方法建立例項。至少要求 汽車能夠加速 減速 停車。再定義乙個小汽車類carauto 繼承auto 並新增空調 cd屬性,並且重新實現方法覆蓋加速 減速的方法 class auto stop flag 停車 acce...

Python專案 Day15 物件導向(高階

動態為物件繫結方法 from types import methodtype class person pass def displayme self print my genderis self.gender 給乙個例項繫結的方法,對另乙個例項是不起作用的 p1.displayme methodt...

檔案操作(day15)

呼叫函式可以使用被呼叫函式動態分配的 儲存區calloc函式也可以動態分配一組連續的 儲存區這個函式可以把所有動態分配的儲存區 內容設定成0 為了使用這個函式也需要包含stdlib.h標頭檔案 這個函式需要兩個引數,第乙個引數表示要 分配的儲存區個數,第二個引數表示單個 儲存區的大小 這個函式的返回...