面向对象编程(第四篇)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/dongzixian/article/details/90760086

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'

猜你喜欢

转载自blog.csdn.net/dongzixian/article/details/90760086