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 例項的生成操作...