Day14,
一、動態的給實例添加屬性與方法並使用(__slots__)
#動態的給對象添加對象屬性per.age = 18#只針對於當前對象生效,對於類創建的其他對象沒有作用#動態的添加方法from types import MethodTypedef say(self): # 定義一個函數作為實例方法 print("my name is " + self.name)per.speak = MethodType(say, per) # 給實例綁定一個方法per.speak() #調用
注意:給一個實例綁定的方法,對另一個實例是不起作用的,給所有實例都綁定方法,可以給class綁定方法
def set_score(self, score): self.score = scoreStudent.set_score = MethodType(set_score, None, Student)
如何限制class的屬性:__slots__ 變數
概念: Python允許在定義class的時候,定義一個特殊的__slots__變數,來限制該class能添加的屬性:
#創建一個空類class Person(object): __slots__ = ("name", "age", "speak") #用tuple定義允許綁定的屬性名稱動態綁定的 屬性名需要是 元組中的名字
注意: __slots__定義的屬性僅對當前類起作用,對繼承的子類是不起作用的
二、@property方便私有變數調用
對象名.屬性名
調用屬性直接對外暴露,不安全,沒有數據過濾。公開方法調用不方便,可以讓你對受限制訪問的屬性:
使用語法 @property,將私有的屬性裝飾成以 「對象名.屬性名」 的方式直接訪問,方法名為受限制的變數去掉雙下劃綫
@propertydef age(self): return self.__age
@去掉下劃線變數名.setter
將私有的屬性裝飾成以 「對象名.屬性名 = 值」 的方式直接修改值
@age.setterdef age(self, age): if age < 0: age = 0 self.__age = age
@property的目的是為了驗證數據的有效,另外簡化修改私有屬性的操作,之前是通過方法來操作私有函數,使用之後 ,可以直接以"對象名.屬性名"的方式來賦值和讀取。
三、運算符重載
在Python的object中已提供了豐富的運算操作函數,我們可以重寫這些函數,來實現相關操作。
#算術運算__add__: +__sub__: -__mul__ : *__truediv__: /__floordiv__: //__mod__: %__divmod__: (x/y, x%y)__pow__: **__lshift__: <<__rshift__: >>__and__: & 位與__xor__: ^ 位異或__or__: | 位或
擴展說明:
1)以上函數名前加上「r」 ,如__radd__: 即是反向操作(other.data + self.data)
2)以上函數名加上「i」 ,如__iadd__: 即是增量運算, 結果是 self.data =self.data+other.data
class Operator: def __init__(self, data): self.data = data def __add__(self, other): return self.data + other.data def __sub__(self, other): return self.data - other.data# 聲明第一個數的類對象d1 = Operator(3)d2 = Operator(4) #聲明操作的第二個類對象print(d1 + d2)print(d2 - d1)
比較運算符(用法用上)
__lt__: <__le__: <=__eq__: ==__ne__: !=__gt__: >__ge__: >=
一元操作符
__pos__: + 正號__neg__: -負號__abs__: 絕對值__invert__: ~按位取反 __complex__: 字元轉數字__int__: 轉為int數值__float__: 轉為float數值__round__: 四捨五入,近似值
格式化
__str__: 列印中,轉成字元串__repr__: repr() 對象字元串表示__bytes__: bytes()對象位元組字元表示__format__: format()格式化表示
屬性訪問
__getattr__: 獲取(不存在)屬性__getattribute__: getattr() hasattr() 獲取屬性__setattr__: setattr() 設置屬性__delattr__: delattr() 刪除屬性
四、作業
- Bank System(模擬銀行系統)
思路:
1)界面類:
屬性:
行為: 顯示歡迎頁, 登錄頁面, 程序主界面
2)銀行功能類:
屬性:
行為: 開戶; 查詢; 存款; 取款; 轉賬; 改密; 鎖定; 解鎖; 銷戶; 補卡; 退出
3) 用戶類:
屬性: 名字,身份證號,電話號,銀行卡
方法:
4)卡類:
屬性: 卡號,餘額,密碼
方法:
推薦閱讀:
※Django學習筆記一:搭建簡易博客
※Python Numpy 教程
※左手用R右手Python系列5——數據切片與索引
※黃哥Python 轉載的霸氣文章"Yes, Python is Slow, and I Don』t Care"
※用Python入門不明覺厲的馬爾可夫鏈蒙特卡羅(附案例代碼)