python面向对象(反射)(四)

  • 2020 年 1 月 23 日
  • 筆記

1. isinstance, type, issubclass

    isinstance: 判断你给对象是否是xx类型的. (向上判断

    type: 返回xxx对象的数据类型

    issubclass: 判断xxx类是否xxx的子类

class Animal:      def eat(self):          print("刚睡醒吃点儿东西")    class Cat(Animal):      def play(self):          print("猫喜欢玩儿")    c = Cat()    print(isinstance(c, Cat)) # True  print(isinstance(c, Animal)) # True    a = Animal()  print(isinstance(a, Cat)) # 不能向下判断  False    print(type(a)) # 返回 a的数据类型  print(type(c)) # 精准的告诉你这个对象的数据类型    # 判断.xx类是否是xxxx类的子类  print(issubclass(Cat, Animal))  # True  print(issubclass(Animal, Cat))  # False

2. 如何区分方法和函数

    在类中:

        实例方法

            如果是类名.方法  函数

            如果是对象.方法  方法

        类方法: 都是方法

        静态方法: 都是函数

    from types import MethodType, FunctionType

    isinstance()

from types import FunctionType, MethodType  #  引入方法和函数的模块  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

3. 反射

    一共就4个函数

    attr: attribute

    getattr()

        从xxx对象中获取到xxx属性值

    hasattr()

        判断xxx对象中是否有xxx属性值

    delattr()

        从xxx对象中删除xxx属性

    setattr()

        设置xxx对象中的xxx属性为xxxx值

class Person:      def __init__(self, name,wife):          self.name = name          self.wife = wife      p = Person("宝宝", "林志玲")    print(hasattr(p, "wife"))  print(getattr(p, "wife")) # p.wife    setattr(p, "wife", "胡一菲") # p.wife = 胡一菲  setattr(p, "money", 100000) # p.money = 100000    print(p.wife)  print(p.money)    delattr(p, "wife") # 把对象中的xxx属性移除. 并不是p.wife = None  print(p.wife)