面向对象编程(第四篇)
生活随笔
收集整理的這篇文章主要介紹了
面向对象编程(第四篇)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
issubclass()與isinstance()
內置函數issubclass()用于判斷類對象與類對象之間的關系
內置函數isinstance()用于判斷實例對象與類對象之間的關系
內置函數issubclass()接受兩個實參,
第一個實參是類對象,
第二個實參是類對象或由類對象組成的元組。
當第二個實參是類對象時,如果第一個實參是二個實參的子類,那么返回True
當第二個實參是類對象組成的元組時,如果第一個實參是第二個實參中任意一個類對象的子類,返回True
class A(object):pass class B(object):pass class C(object):pass class D(A):pass print(issubclass(D,A)) print(issubclass(D,B)) print(issubclass(D,(B,A,C))) print(issubclass(D,(B,C))) print(issubclass(bool,int)) print(issubclass(bool,str)) print(issubclass(bool,(str,int,dict))) print(issubclass(bool,(str,list,dict))) >True False True False True False True False內置函數isinstance()接受兩個實參,
第一個實參是實例對象,
第二個實參是類對象或由類對象組成的元組。
當第二個實參是類對象時,如果第一個實參是二個實參的實例對象,或者第一個實參是第二個實參的子類的實例對象,那么返回True
當第二個實參是類對象組成的元組時,如果第一個實參是第二個實參中任意一個類對象或其子類的實例對象,返回True
class A(object):pass class B(object):pass class C(object):pass class D(A):pass print(isinstance(D(),D)) print(isinstance(D(),A)) print(isinstance(D(),(D,B,C))) print(isinstance(D(),(B,A,C))) >True True True Truetype()與dir()
內置函數type()用于獲得指定對象的類型
實例對象的類型是其對應的類對象
類對象的類型是type,也就是說,類對象時type的一個實例對象
class MyClass(object):pass mc = MyClass() print(type(mc)) > <class '__main__.MyClass'> print(type(18)) print(type('abc')) print(type(MyClass)) print(type(int)) > <class 'int'> <class 'str'> <class 'type'> <class 'type'>自定義函數對象的類型是function。
內置函數對象的類型是builtin_function_or_method
def do_sth():pass print(type(do_sth)) > <class 'function'> print(type(dir)) > <class 'builtin_function_or_method'>可以使用運算符==判斷某個對象的類型是否是指定的類型
對于基本數據類型,可以直列使用其對應的類名;如果不是基本數據類型,需要使用標準庫中的模塊types中定義的變量
import types print(type(do_sth) == types.FunctionType) print(type(print) == types.BuiltinFunctionType) > True Truedir()
對于指定的類對象或實例對象,可以調用內置函數dir()獲得其所有可以訪問的屬性和方法(包括從父類中繼承的屬性和方法)的列表
類對象與實例對象的結果是有區別的,類對象的結果中不包括實例屬性
class MyClass(object):ca = "ca"def __init__(self):self.ia = "ia"def im(self):pass@classmethoddef cm(cls):pass@staticmethoddef sm():pass print(dir(MyClass)) > ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'ca', 'cm', 'im', 'sm'] print(dir(MyClass())) > ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'ca', 'cm', 'ia', 'im', 'sm']hasattr(),getattr(),setattr(),delattr()
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 = value
4.delattr(object,name)用于刪除指定的對象object中名為參數name的屬性或方法。
delattr(object,name)等價于:del object.name
class MyClass(object):def __init__(self):self.x = 1def do_sth(self):print("do_sth被調用") mc = MyClass() print(hasattr(mc,'x')) print(hasattr(mc,'do_sth')) print(hasattr(mc,'y')) > True True False print(getattr(mc,'x')) >1 print(getattr(mc,'y')) >--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-5-d4450b7ca500> in <module>() ----> 1 print(getattr(mc,'y'))AttributeError: 'MyClass' object has no attribute 'y' print(getattr(mc,'y',2)) >2 setattr(mc,'z',3)# 等價于mc.z = 3 print(getattr(mc,'z')) >3 delattr(mc,'z') print(hasattr(mc,'z')) >False算術運算符重載
標準算術運算符在默認情況下不能用于自定義類對象的實例對象
class MyClass(object):pass class MyClass2(object):pass print(MyClass() + MyClass2()) >--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-12-fc67b776bd15> in <module>()3 class MyClass2(object):4 pass ----> 5 print(MyClass() + MyClass2())TypeError: unsupported operand type(s) for +: 'MyClass' and 'MyClass2'如果想讓標準算術運算符可以用于自定義類對象的實例對象
必須在自定義類對象中實現標準算術運算符對于的以下特殊方法:
1.+對應的特殊方法是__add__()和__radd__()
2.-對應的特殊方法是__sub__()和__rsub__()
3.*對應的特殊方法是__mul__()和__rmul__()
4./對應的特殊方法是__truediv__()和__rtruediv__()
5.//對應的特殊方法是__floordiv__()和__rfloordiv__()
class MyClass1(object):def __add__(self,other):return "這是__add__+的結果" class MyClass2(object):def __radd__(self,other):return "這是__radd__+的結果" obj1 = MyClass1() obj2 = MyClass2() print(obj1+obj2) > 這是__add__+的結果 class MyClass1(object):pass class MyClass2(object):def __radd__(self,other):return "這是__radd__+的結果" obj1 = MyClass1() obj2 = MyClass2() print(obj1+obj2) > 這是__radd__+的結果 class MyClass1(object):pass class MyClass2(object):pass obj1 = MyClass1() obj2 = MyClass2() print(obj1+obj2) >--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-13-79cbfd976803> in <module>()5 obj1 = MyClass1()6 obj2 = MyClass2() ----> 7 print(obj1+obj2)TypeError: unsupported operand type(s) for +: 'MyClass1' and 'MyClass2' class MyClass1(object):def __add__(self,other):print("特殊方法__add__被調用")return NotImplemented class MyClass2(object):def __radd__(self,other):return "這是__radd__+的結果" obj1 = MyClass1() obj2 = MyClass2() print(obj1+obj2) >特殊方法__add__被調用 這是__radd__+的結果 class MyClass1(object):def __add__(self,other):print("特殊方法__add__被調用")return NotImplemented class MyClass2(object):def __radd__(self,other):print("特殊方法__radd__被調用")return NotImplemented obj1 = MyClass1() obj2 = MyClass2() print(obj1+obj2) >特殊方法__add__被調用 特殊方法__radd__被調用 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-15-a92b8ee08b44> in <module>()9 obj1 = MyClass1()10 obj2 = MyClass2() ---> 11 print(obj1+obj2)TypeError: unsupported operand type(s) for +: 'MyClass1' and 'MyClass2'總結
以上是生活随笔為你收集整理的面向对象编程(第四篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 贷款的基本程序是什么
- 下一篇: 房贷审批没有通过的原因 这几点你有没有