面向对象之反射

一、三个内置函数issubclass、type、isinstance

issubclass():传入两个参数,判断第一个参数是否是第二个参数的后代

class Animals:
    pass
class Cat(Animals):
    pass
class Bosicat(Cat):
    pass
print(issubclass(Cat, Animals))
print(issubclass(Animals, Cat))
print(issubclass(Bosicat, Animals))

运行结果:

True
False
True

说明判断的是第一个参数是否是第二个参数的后代。

type:

对于list、dict这些数据类型都是类,type的作用是精准的给出对象的类

class Foo:
pass
obj = Foo()
print(obj, type(obj)) # 查看obj的类

也可以在计算的时候判断这个类型是字符型或者浮点型

def add(a, b):
    if (type(a) == int or type(a) == float) and (type(b) == int or type(b)== float):
        return a + b
    else:
        print("我要报错")

isinstance也可以判断xxx是yyy类型的数据. 但是isinstance没有type那么精准.

class Base:
    pass
class Foo(Base):
    pass
class Bar(Foo):
    pass
print(isinstance(Foo(), Foo)) # True
print(isinstance(Foo(), Base)) # True
print(isinstance(Foo(), Bar)) # False

isinstance可以判断该对象是否是xxx家族体系中的(只能往上判断)

二、区分函数和方法

1.打印一下

1)类方法. 不论任何情况, 都是方法.
2)静态方法, 不论任何情况. 都是函数
3)实例方法, 如果是实例访问. 就是方法. 如果是类名访问就是函数

2.⽤用程序来帮我们分辨。


# 所有的方法都是MethodType的实例例
# 所有的函数都是FunctionType的实例例


from
types import MethodType, FunctionType def func(): pass print(isinstance(func, FunctionType)) # True print(isinstance(func, MethodType)) # False class Foo: def chi(self): print("我是吃") @staticmethod def static_method(): pass @classmethod def class_method(cls): pass obj = Foo() print(type(obj.chi)) # method print(type(Foo.chi)) # function print(isinstance(obj.chi, MethodType)) # True print(isinstance(Foo.chi, FunctionType)) # True print(isinstance(Foo.static_method, FunctionType)) # True print(isinstance(Foo.static_method, MethodType)) # False print(isinstance(Foo.class_method, FunctionType)) # False print(isinstance(Foo.class_method, MethodType)) # True

三、反射

四个内置函数:

1. hasattr(obj, str) 判断obj中是否包含str成员

2. getattr(obj,str) 从obj中获取str成员

3. setattr(obj, str, value) 把obj中的str成员设置成value. 注意. 这⾥里里的value可以是值, 也可以是函数或者⽅法

4.delattr(obj, str) 把obj中的str成员删除掉

原文地址:https://www.cnblogs.com/doit9825/p/13173232.html