動態為物件繫結方法
from types import methodtype
class person:
pass
def displayme(self):
print("my genderis:",self.gender)
#給乙個例項繫結的方法,對另乙個例項是不起作用的:
p1.displayme=methodtype(displayme,p1)
p1.displayme()
動態為類增加屬性和方法
person.gender='male'
def displayme(self):
print('my genders:',self.gender)
person.displayme=displayme
使用slots限制例項的屬性,比如,只允許對student例項新增name和age屬性。
class person:
__slots=['age','name']
p1=person()
print(dir(p1))
#這是看到p1物件裡已經存在name和age屬性了
p1.gender='female'
#這裡會報錯
刪除屬性
person.nation='china'
p1.gender='male'
del p1.gender
del p1.nation #error nation是屬於類的,不可以通過物件刪除
del person.nation
del p1.age
利用動態函式繫結
setattr(ee2,'age',8)
getattr(ee1,'age')
hasattr(ee1,'age')
delattr(ee1,'age')
私有屬性
_xx以單下劃線開頭表示的是protected型別的變數.即保護型變數
__xx雙下劃線開頭的是私有型別的變數.只允許這個類內部進行訪問,類外部不能訪問.類內部可以寫乙個方法呼叫私有變數,然後類外部就可以訪問這個方法進行訪問該私有變數了
__xx__定義的是特例方法. 如__slots__限制屬性,重寫str方法等等
class pub():
# protected型別的變數和方法 在類的例項中可以獲取和呼叫
_name = 'protected型別的變數'
__info = '私有型別的變數'
def _func(self):
print("這是乙個protected型別的方法")
def __func2(self):
print('這是乙個私有型別的方法')
# 如果想要在例項中獲取到類的私有類形變數可以通過在類中宣告普通方法,返回私有類形變數的方式獲取
def get(self):
return(self.__info)
p=pub()
p.__info # error 因為__info是私有變數只有在類內部才可見,所以要用內部方法
python內建類屬性
__dict__ : 類的屬性(包含乙個字典,由類的資料屬性組成)
__doc__ :類的文件字串
__module__: 類定義所在的模組(類的全名是'__main__.classname',如果類位於乙個匯入模組mymod中,那麼classname.__module__ 等於 mymod)
__bases__ : 類的所有父類構成元素(包含了乙個由所有父類組成的元組),使用方式:類名.__bases__,簡單點說就是該類的包含所有父類的元組
唯讀屬性
@ property 作用就是採用訪問屬性的方式訪問函式。
class car:
__wheels=4
@property
def wheels(self):
return self.__wheels
@property可以把方法變為屬性,
class car:
__wheels=4
__voice='didi'
def __init__(self,color,speed,__wheels):
self.color=color
self.speed=80
self.__wheels=__wheels
@property#唯讀
def run(self):
print('i can run %d speed'%self.speed)
@run.setter#讀寫
def run(self,wh):
self.speed=wh
@wheels.deleter#刪除
def wheels(self):
del self.__wheels
car1=car('blue',100,4)
print(car1.color)
car1.run=120
car1.run
del car1.wheels#可以刪除物件的私有屬性
這個屬性是不可以通過del car1.run 來刪除的。因為他本來就不是乙個屬性
@run.deleter
def run(self):
del self.speed
print("你的車輪已經被拆除...")
靜態方法
普通的方法,可以在例項化後直接呼叫,並且在方法裡可以通過self.呼叫例項變數或類變數,但靜態方法是不可以訪問例項變數或類變數的,乙個不能訪問例項變數和類變數的方法,其實相當於跟類本身已經沒什麼關係了,它與類唯一的關聯就是需要通過類名或者物件名來呼叫這個方法。
class car:
__wheels=4
__voice='didi'
def __init__(self,color):
self.color=color
@property
def wheels(self):
return self.__wheels
#靜態方法在類中也不需要傳入 self引數
@staticmethod
def wash():
print('i am washing')
類方法通過@classmethod裝飾器實現,類方法和普通方法的區別是, 類方法只能訪問類變數,不能訪問例項變數,注意:類方法是可以通過物件來訪問的
class car:
__wheels=4
__voice='didi'
def __init__(self,color):
self.color=color
@property
def wheels(self):
return self.__wheels
@classmethod
def dudu(cls):
print(cls.__voice)
@staticmethod
def wash():
print('i am washing')
Day 15 物件導向2
day 15 物件屬性操作語法 1 物件.屬性名 屬性名不存在時會報錯 2 getattr.物件,屬性名 注意 屬性名要用 引起來 在屬性名後面加乙個引數表示預設值,在屬性名不存在時返回預設值 語法 1 物件.屬性名 值 屬性名存在時會修改 屬性值不存在時會新增 2 setattr 物件,屬性名 值...
Day 15 物件導向2習題
建立乙個汽車類auto,包括輪胎個數,汽車顏色,車身重量,速度等屬性,並通過不同的構造方法建立例項。至少要求 汽車能夠加速 減速 停車。再定義乙個小汽車類carauto 繼承auto 並新增空調 cd屬性,並且重新實現方法覆蓋加速 減速的方法 class auto stop flag 停車 acce...
python學習歷程day15
學習內建函式 包括map,sort,repr,lambda,filter,遞迴,二分法查詢 1.map lst 1,4,7,2,5,8 def func el return el 2 func lst 或者m map lambda el el 2,lst 把後面的可迭代物件中的每乙個元素傳遞給fun...