面向對象編程(第四篇)

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
True

type()與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
True

dir()

對於指定的類對象或實例對象,可以調用內置函數dir()獲得其所有可以訪問的屬性和方法(包括從父類中繼承的屬性和方法)的列表
類對象與實例對象的結果是有區別的,類對象的結果中不包括實例屬性
class MyClass(object):
    ca = "ca"
    def __init__(self):
        self.ia = "ia"
    def im(self):
        pass
    @classmethod
    def cm(cls):
        pass
    @staticmethod
    def 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 = 1
    def 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'

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章