class提供的內建方法

2021-10-04 09:26:31 字數 3138 閱讀 8385

hasattr(obj,『屬性』) #obj.屬性 是否存在

getattr(obj,『屬性』) #獲取obj.屬性 不存在則報錯

getattr(obj,『屬性』,『預設值』) #獲取obj.屬性 不存在不會報錯,並返回預設值

setattr(obj,『屬性』,『屬性的值』) #obj.屬性=屬性的值

delattr(obj,『屬性』) #del obj.屬性

除了__ getattr__(可用來做授權功能)其他的很少用

obj點的方式去操作屬性時觸發的方法

注:這裡的這些和上面自省的是沒有聯絡的

__getattr__:obj.屬性 不存在的時候觸發

__setattr__:obj.屬性=屬性的值 時觸發

__delattr__:del obj.屬性 時觸發

obj[『屬性』]的方式去操作屬性時觸發的方法

__getitem__:obj['屬性']  時觸發

__setitem__:ob['屬性']=屬性的值 時觸發

__delitem__:del obj['屬性'] 時觸發

描述就是乙個新式類,這個類至少要實現上述三個方法的乙個

class 描述符:

def __get__():

pass

def __set__():

pass

def __delete__():

pass

class 類:

name=描述符()

obj=類()

obj.name #觸發get

obj.name='alex' #觸發set

del obj.name #觸發delete

'''

當類中沒有__str__時,它預設列印內容如下,對於使用者來說有用的資訊只有__main__.foo

當我們回想要他列印的只有有用給的資訊或者其他需要的資訊,這時就需要用到__str__

'''class foo:

pass

f1=foo()

print(f1)

結果:

<__main__.foo object at 0x000000c96c398eb8>
#注:__str__()返回的只能是字串

class bar:

def __init__(self,name,age):

self.name=name

self.age=age

def __str__(self):

return 'bar(%s,%s)'%(self.name,self.age)

b1=bar('alex',18)

print(b1)

str(b1)#-->b1.__str__()

結果:

bar(alex,18)

'bar(alex,18)'

class foo:

def __repr__(self):

return 'as123'

f1=foo()

print(f1)

結果:as123

為了達到限制的目的,python允許在定義class的時候,定義乙個特殊的__slots__變數,來限制該class例項能新增的屬性:

class student(object):

__slots__ = ('name', 'age') # 用tuple定義允許繫結的屬性名稱

然後,我們試試:

>>> s = student() # 建立新的例項

>>> s.name = 'michael' # 繫結屬性'name'

>>> s.age = 25 # 繫結屬性'age'

>>> s.score = 99 # 繫結屬性'score'

traceback (most recent call last):

file "", line 1, in attributeerror: 'student' object has no attribute 'score'

由於'score'沒有被放到__slots__中,所以不能繫結score屬性,試圖繫結score將得到attributeerror的錯誤。

使用__slots__要注意,__slots__定義的屬性僅對當前類例項起作用,對繼承的子類是不起作用的

檢視類的文件資訊

class foo:

'我是描述資訊'

pass

class bar(foo):

pass

print(foo.__doc__)

print(bar.__doc__) #該屬性無法繼承給子類

結果:

我是描述資訊

none

檢視物件在哪個模組,檢視物件是由哪個類產生的

class c:

def __init__(self):

self.name = 『sb'

from lib.aa import c

obj = c()

print obj.__module__ # 輸出 lib.aa,即:輸出模組

print obj.__class__ # 輸出 lib.aa.c,即:輸出類

物件後面加括號,觸發執行。

注:構造方法的執行是由建立物件觸發的,即:物件 = 類名() ;而對於call方法的執行是由物件後加括號觸發的,即:物件() 或者 類()()

class foo:

def __init__(self):

pass

def __call__(self, *args, **kwargs):

print('__call__')

obj = foo() # 執行 __init__

obj() # 執行 __call__

列舉提供的方法

1.compareto 比較兩個列舉常量在列舉類裡面的位置關係.還是來看看下面的 首先來看看列舉類 public enum contentspublic class demoenum 該方法用於比價兩個列舉常量的位置關係.下面來看看輸出的結果。contents b和前面的比較的結果為1 conten...

獲取Class物件的方法及Class型別的一些討論

1 class.forname classname 2 classname.class 如果是陣列,則是陣列型別.class 3 物件.getclass 例 1 string path packagename.classname 包名,類名 23 class c1 class.forname pat...

python的內建方法

最近需要重新定義類,老是會忘記python內建方法的的作用和名稱,mark一下加深一下記憶。基本上python的常見內建方法如下面所示 內建方法說明 init self,初始化物件,在建立新物件時呼叫 del self 釋放物件,在物件被刪除之前呼叫 new cls,args,kwd 例項的生成操作...