面向对象编程04
14、issubclass()與isinstance()
內置函數issubclass()用于判斷類對象與類對象之間的關系。
內置函數isinstance()用于判斷實例對象與類對象之間的關系。
內置函數issubclass()接收兩個實參,
第一個實參是類對象,
第二個實參是類對象或由類對象組成的元組。
當第二個實參是類對象時,如果第一個實參是第二個實參的子類,那么返回True。
當第二個實參是類對象組成的元組時,如果第一個實參是第二實參中任意一個類對象的子類,返回True。
內置函數isinstance接收兩個實參,
第一個實參是實例對象,
第二個實參是類對象或由類對象組成的元組。
當第二個實參是類對象時,如果第一個實參是第二個實參的實例對象,或者第一個實參是第二個實參的子類的實例對象,那么返回True。
當第二個實參是類對象組成的元組時,如果第一個實參是第二個實參中任意一個類對象或其子類的實例對象,那么返回True。
15、type()與dir()
內置函數type()用于獲得指定對象的類型。
實例對象的類型是其對應的類對象。
類對象的類型是type,類對象時type的一個實例對象。
自定義函數對象的類型是function.
內置函數對象的類型是builtin_function_or_method。
可以使用運算符==判斷某個對象的類型是否是指定的類型。
對于基本數據類型,可以直接使用其對應的類名;如果不是基本數據類型,需要使用標準庫中的模塊types中定義的變量。
dir()函數
對于制定的類對象或實例對象,可以調用內置函數dir()獲得其所有可以訪問的屬性和方法(包括從父類中繼承的屬性和方法)的列表。
類對象與實例對象的結果是有區別的,類對象的結果中不包括實例屬性。
調用內置函數dir()后的返回值,很多屬性和方法都是以雙下劃線__開頭和結尾的,這些屬性和方法中的絕大多數都繼承自類object。
以雙下劃線__開頭和結尾的屬性被稱為特殊屬性,以雙下劃線__開頭和結尾的方法被稱為特殊方法。
特殊屬性和特殊方法都是系統預定義的,我們自定義的屬性名和方法名不要以雙下劃線__開頭和結尾。
在我們自定義類對象時,經常會重寫一個或多個特殊方法,例如__init__。特殊方法會在特定的情形下被自動調用,很少需要手動調用特殊方法。
16、屬性之增刪改查
1、hasattr(object,name)
用于判定指定的對象object是否有參數name指定的屬性或方法。
2、getattr(object,name[ , default])
用于獲取指定的對象object中名為name的屬性或方法;
如果不指定參數default,那么當object中不存在名為name的屬性或方法時,拋出AttributeError;
如果指定參數default,那么當object中不存在名為name的屬性或方法時,就會返回default。
getattr(object,name)等價于:object.name。
3、setattr(object,name,value)
用于在指定的對象object中添加或修改名為參數name的屬性或方法,添加或修改后的值為value.
setattr(object,name,value)等價于:object.name。
4、delattr(object,name)
用于刪除指定的對象object中名為參數name的屬性或方法。
delattr(object,name)等價于:del object.name.
注意:只有在不知道對象信息的情況下,才會去獲取對象的信息。因此,如果可以直接寫:object.name,就不要寫為:getattr(object,‘name’)。
17、算術運算符重載
標準算術運算符在默認情況下不能用于自定義類對象的實例對象。
如果想讓標準算術運算符可以用于自定義類對象的實例對象,必須在自定義類對象中實現標準算術運算符對應的以下特殊方法:
1、+對應的特殊方法是__add__()和__radd__();
2、-對應的特殊方法是__sub__()和__rsub__();
3、*對應的特殊方法是__mul__()和__rmul__();
4、/對應的特殊方法是__truedive__()和__rtruedive__();
5、//對應的特殊方法是__floordive__()和__rfloordive__()。
假設兩個運算數obj1和obj2,以+為例,對于obj1+obj2,需要在obj1對應的自定義類對象中實現特殊方法__add__(),或在obj2對應的自定義類對象中實現特殊方法__radd__()。
18、str()與__repr__()
類對象的特殊方法,用于自定義并返回實例對象的字符串表示形式。
類對象的特殊方法之__str__()和__repr__()用于自定義并返回實例對象的字符串表示形式。
1、當在交互式命令行中直接打印一個實例對象時,如果在實例對象對應的類對象中實現了特殊方法__repr__(),會自動調用該方法;否則,會打印實例對象對應的類對象和實例對象在內存中的地址。
2、當調用內置函數print打印一個實例對象時,如果在實例對象對應的類對象中實現了特殊方__str__(),會自動調用該方法;否則,如果在實例對象對應的類對象中實現了特殊方法__repr__(),會自動調用該方法;否則,會打印實例對象對應的類對象和實例對象在內存的地址。
3、當調用內置函數str創建字符串冰倩實參是一個實例對象時,如果在實例對象對應的類對象中實現了特殊方法__repr__(),在內置函數str道德內部會自動調用該方法;否則,會打印實例對象對應的類對象和實例對象在內存中的地址。
4、當調用內置函數repr創建字符串并且實參是一個實例對象時,如果在實例對象對應道德類對象中實現了特殊方法__repr__(),在內置函數repr的內部會自動調用該方法;否則,會打印實例對象的類對象和實例對象在內存中的地址。
通常情況下,在類對象的特殊方法__str__()和__repr__()的實現代碼是一樣的,因此,當實現了其中一個后,可以把其方法名賦值給另一個的方法名。
class MyClass(object):def __str__(self):return "這是實例對象的字符串表示形式"__repr__ = __str__內置函數str()和repr()都返回對象的字符串,其區別在于:
str()的返回值是給用戶的,更加用戶友好;
repr()的返回值是給程序開發者看的,是為了調試服務。
注:嵩天老師《python及其應用》筆記
總結
- 上一篇: 面向对象编程03—封装、继承、重写、MR
- 下一篇: 面向对象编程05