一、三个内置函数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成员删除掉