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() 刪除屬性

四、作業

  1. Bank System(模擬銀行系統)

思路:

1)界面類:

屬性:

行為: 顯示歡迎頁, 登錄頁面, 程序主界面

2)銀行功能類:

屬性:

行為: 開戶; 查詢; 存款; 取款; 轉賬; 改密; 鎖定; 解鎖; 銷戶; 補卡; 退出

3) 用戶類:

屬性: 名字,身份證號,電話號,銀行卡

方法:

4)卡類:

屬性: 卡號,餘額,密碼

方法:


推薦閱讀:

Django學習筆記一:搭建簡易博客
Python Numpy 教程
左手用R右手Python系列5——數據切片與索引
黃哥Python 轉載的霸氣文章&quot;Yes, Python is Slow, and I Don』t Care&quot;
用Python入門不明覺厲的馬爾可夫鏈蒙特卡羅(附案例代碼)

TAG:Python | Python3x | 人工智慧 |