import typesclass dog(object):
__slots__ = ("name", "color", "info")
#定義__slots__
#該類中只允許 類物件 動態增加 name, color, info, body_len 屬性或方法(都是例項屬性或方法)
#__slots__對類的 動態新增屬性和方法 沒有限制,而 類物件 不能再動態新增物件屬性和方法
#__slots__只對類物件進行限制,不對類進行限制
#_slots__僅對當前類起作用,對繼承的子類不起作用
#__slots__不僅限制類物件的屬性,還限制類物件的方法
#在子類中定義__slots__,子類允許定義的屬性就是自身的__slots__加上父類的__slots__
company = '藍月公司' #company 是類屬性
len_attr = 1 #初始化狗的長度
def __init__(self, name):
self.name = name
#name 為例項屬性
@staticmethod #靜態方法可以寫在類內
def state():
print("dog 類的靜態方法(state)")
@classmethod #類方法可以寫在類內
def get_state(cls):
print("狗狗的產地是" + cls.address)
@property
def body_len(self):
return self.len_attr
#如果不存在 __slots__ 作為約束,並且類屬性不存在 len_attr 則 property 相當於新定義了乙個例項屬性 len_attr
#方法名(body_len)不能與其設定的屬性名(len_attr)相同
@body_len.setter #裝飾器名(body_len.setter)的前半部分必須與上文被裝飾器 property 裝飾的函式(body_len)同名
def body_len(self, value): #此處的方法名必須與上文中的被裝飾器裝飾的方法名相同,如果不同也不會報錯,
#因為得到值本質呼叫的是上文被裝飾器property裝飾的函式(函式名並不重要)
#而設定值本質呼叫的是被裝飾器 body_len.setter 裝飾的函式(函式名並不重要)
#但為了能實現 把方法"變成"屬性 ,這裡的函式名必須與上文的函式名同名,否則就失去了裝飾器 @property 存在的意義
if value > 2:
print("狗的體長必須小於2公尺")
else:
dog.len_attr = value
def get_name(self):
return self.name
def set_name(self, name):
self.name = name
name_attr = property(fget=get_name, fset=set_name, fdel=none, doc="設定狗的名字")
#property 函式就相當於 @property 裝飾器
d = dog('薩摩耶') #例項化 dog 物件
e = dog('土狗')
d.color = 'black' #只給 d 物件增加 color 屬性,dog 基類和其它 dog 物件並未有 color 屬性
print(hasattr(d, 'color')) #判斷 d 物件是否具有 color屬性
print(hasattr(e, 'color'))
dog.address = '中國' #給 dog 基類增加 address 屬性
print(hasattr(d, 'address'))
print(hasattr(e, 'address'))
def info(self):
print("產於" + self.address + "的" +self.name + "的顏色為" + self.color)
d.info = types.methodtype(info, d) #只給 d 物件增加 info 方法,dog 基類和其它 dog 物件並未有 info 方法
d.info() #此方法為例項方法
print(hasattr(d, 'info'))
print(hasattr(e, 'info'))
@staticmethod #靜態方法可以寫在類外(但必須指定(#000000#))
def show():
print("dog 類的靜態方法(show)")
dog.show = show #000000#
dog.show()
d.show()
e.show()
d.state()
e.state()
dog.state()
@classmethod
def get_show(cls): #cls 只能呼叫 類屬性 而不能呼叫 例項屬性
print("公司:" + cls.company + " 產地:" + cls.address)
print(hasattr(cls, 'name')) #不存在 name 屬性,因為它是 例項屬性
dog.get_show = get_show
d.get_show()
d.body_len = 3
d.body_len = 1.8
print("當前長度" + str(d.body_len) + "公尺")
print(d.name_attr)
d.name_attr = "杜賓犬"
Python 類屬性和類方法
僅用學習參考 使用物件導向開發,第 1 步是設計類使用類名 建立物件,建立物件的動作有兩步 物件建立後,記憶體中就有了乙個物件的實實在在的存在 例項 因此,通常也會把 建立出來的物件叫做類的例項建立物件的動作叫做例項化物件的屬性叫做例項屬性物件呼叫的方法叫做例項方法 在程式執行時 物件各自擁有自己的...
python 類屬性方法 例項屬性方法
型別 描述類變數 靜態變數 所有例項共有,每個例項可以不加self呼叫 類方法 靜態方法 所有例項共有,每個例項都可以呼叫 例項變數 非靜態變數 單個例項所有,需通過self呼叫 例項方法 非靜態方法 單個例項所有,下例中class name是類屬性,所有的例項都具有該屬性,而且任何乙個例項修改都可...
python 類屬性 用處 Python類屬性詳解
類屬性1.類定義後就存在,而且不需要例項化 2.類屬性使得相同類的不同例項共同持有相同變數 類屬性例項 attrb.py class testcss cssa class attribe def init self self.a 0 self.b 10 def info self print a s...