python isinstance和issubclass,区分方法和函数,反射

时间:2024-05-29 17:07:38

一.isinstance和issubclass

1.isinstance

class Animal:
def eat(self):
print('刚睡醒吃点儿东西') class Cat(Animal):
def play(self):
print('猫喜欢玩儿') c = Cat() print(isinstance(c, Cat)) # c是一只猫
print(isinstance(c, Animal)) # 向上判断 c是一只动物

2.issubclass

 class Animal:
def eat(self):
print('刚睡醒吃点儿东西') class Cat(Animal):
def play(self):
print('猫喜欢玩儿') c = Cat()
print(issubclass(Cat, Animal)) # 判断Cat类是否是Animal类的子类
print(issubclass(Animal, Cat)) # 判断Animal类是否是Cat类的子类

二.区分方法和函数

官方玩法

 from types import FunctionType,MethodType  # 方法和函数  FunctionType 函数类型 MethodType 方法类型
from collections import Iterable, Iterator # 迭代器 class Person:
def chi(self): # 实例方法
print('我要吃鱼') @classmethod
def he(cls):
print('我是类方法') @staticmethod
def pi():
print('你是真的皮') p =Person() print(isinstance(Person.chi, FunctionType)) # True
print(isinstance(p.chi, MethodType)) # True print(isinstance(p.he, MethodType)) # True
print(isinstance(Person.he, MethodType)) # True print(isinstance(p.pi, FunctionType)) # True
print(isinstance(Person.pi, FunctionType)) # True

野路子

打印的结果中包含了function. 函数
method. 方法
 def func():
print('我是函数') class Foo:
def chi(self):
print('我是吃') print(func) #<function func at 0x0000024817BF1E18>
f = Foo()
f.chi()
print(f.chi) # <bound method Foo.chi of <__main__.Foo object at 0x0000024817DCC358>>

三.反射

 class Preson:
def __init__(self, name, laopo):
self.name = name
self.laopo = laopo p = Preson('宝宝', '林志玲') print(hasattr(p, 'laopo')) # p这个对象中是否有老婆这个属性
print(getattr(p, 'laopo')) # p.laopo 获取p这个对象中的老婆属性 # 设置一个对象属性若存在就修改 不存在就添加到这个对象中
setattr(p, 'laopo', '胡一菲') # p.laopo = 胡一菲
setattr(p, 'money', 10000000) # p.money = 10000000 print(p.laopo)
print(p.money) # delattr(p, 'laopo') # 把对象中的xxx属性移除 != p.laopo = None
print(p.laopo) #'Preson' object has no attribute 'laopo' 已经移除了对象中的laopo属性所以报错