Python學習筆記 class中的屬性

2021-09-13 18:34:56 字數 4141 閱讀 7192

python3.x中沒有cmp函式了,定製sorted排序時候,不可以直接return cmp(self.score,b.score)

,要進一步寫詳細。

限制屬性種類——> __slots__

class

person

(object):

__slots__ =

('name'

,'gender'

)def

__init__

(self, name, gender)

: self.name = name

self.gender = gender

class

student

(person)

: __slots__ =

('score'

)def

__init__

(self, name, gender, score)

:super

(student, self)

.__init__(name,gender)

self.score = score

在子類中,只需要宣告一下額外新增的屬性種類即可。

3. 乙個普通的類,例項化後可以正常訪問屬性,可以正常為屬性賦值。

class

person

(object):

def__init__

(self, name, gender)

: self.name = name

self.gender = gender

p = person(

'tom'

,'male'

)print

(p.name,p.gender)

#tom male

p.name =

'alex'

p.gender =

'female'

print

(p.name,p.gender)

#alex female

將某個屬性設定為私有屬性,使變數名以雙下劃線開始即可。私有屬性不可訪問,不可賦值。

class

person

(object):

def__init__

(self, name, gender)

: self.name = name

self.__gender = gender

p = person(

'tom'

,'male'

)try

:print

(p.__gender)

except attributeerror:

print

('attributeerror when trying to access "private" property right after instantiation'

)p.__gender =

'female'

print

(p.__gender)

#attributeerror when trying to access "private" property right after instantiation

#female

對try語句進行稍微改動,再對比以下**:

class

person

(object):

def__init__

(self, name, gender)

: self.name = name

self.__gender = gender

p = person(

'tom'

,'male'

)try

:print

(p._person__gender)

except attributeerror:

print

('attributeerror when trying to access "private" property right after instantiation'

)p.__gender =

'female'

print

(p.__gender)

print

(p._person__gender)

#male

#female

#male

python內所謂的「私有屬性」:當在屬性前加上雙下劃線時,類中並不會直接建立此__membername屬性,而是會建立_classname__membername,這樣在例項外部試圖訪問__membername時,會報錯此屬性不存在,因為確實不存在。當例項化後重新給「私有屬性」賦值時,相當於重新建立了真正的__membername屬性。切記,切記!

像4中的直接賦值固然可以,但如果需要對賦值有效性進行檢驗時,可以使用內建裝飾器來設定對應屬性的getter和setter方法。

class

student

(object):

def__init__

(self, name, score)

: self.name = name

self.__score = score

@property

defscore

(self)

:return self.__score

@score.setter

defscore

(self, score)

:if score <

0or score >

100:

raise valueerror(

'invalid score'

) self.__score = score

s = student(

'bob',59

)print

(s.score)

#此時其實是在呼叫score方法,而非__score屬性

s.score =

60print

(s.score)

try:

s.score =

300except valueerror:

print()

#59#60

將乙個例項化的類變成可呼叫物件—— __call__

class

person

(object):

def__init__

(self, name, gender)

: self.name = name

self.gender = gender

def__call__

(self, friend)

:print

('my name is %s...'

% self.name)

print

('my friend is %s...'

% friend)

p = person(

'bob'

,'male')p(

'tim'

)#my name is bob...

#my friend is tim...

class

fib(

object):

def__init__

(self)

: self.

list=[

]def

__call__

(self,num)

: l =

for i in

range

(num)

:if i !=

0and i !=1:

1]+l[i-2]

)else

: self.

list

= l return self.

list

f = fib(

)print

(f(10))

#[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

C 類class 學習筆記

三看原則 1.看呼叫的成員變數是在類的內部還是類的外部 2.看兒子繼承方式 3.當前變數在兒子中的變數在父親中的訪問控制許可權 類的相容性原則 子類物件可以當做父類物件使用 子類物件可以直接賦值給父類物件 子類物件可以直接初始化父類物件 父類指標可以直接指向子類物件 父類引用可以直接引用子類物件 為...

python 類class基礎簡明筆記

感謝莫煩老師 詳情class calculator 首字母要大寫,冒號不能缺 name good calculator 該行為class的屬性 price 18 def add self,x,y print self.name result x y print result def minus se...

c 學習筆記 class(續1)

struct 結構體在很多情況下可以看作是乙個簡單的類,但是在c 中結構體和類也是有很大的不同,主要有 1 結構體是值型別,而類是引用型別,這樣結構體就主要儲存在棧上 只有當結構體是其他物件的一部分的時候會存在堆上 而類則儲存在堆上。2 結構體不支援繼承。partial classes partia...