python起源反射一说

python所有对象起源于type,由此开启了本篇blog的三个部分

  1. type生成万事万物
  2. 类方法(只使用类变量)、静态方法(只使用实例变量)、属性方法(删除 修改)
  3. 反射注入
# *
# *  @author Zhaoliang Ye 叶昭良(zl_ye@qny.chng.com.cn)
# *  @version V0.1
# *  @Title: tetReflect.py
# *  @Description: 测试反射
# *  @Time: 2022/2/12 15:20
# *


##1 python的起源原子type
def func(self):
    print('hello %s' %self.name)
def __init__(self,name,age):
    self.name = name
    self.age = age

Foo = type('Foo', (object,), {'talk': func,
                              '__init__':__init__})
f = Foo("python起源",22)
f.talk()
print(type(Foo))


## 2 我们可以在type底下 设置静态方法 属性方法(属性方法可以通过setter修改值)

class Dragon(object):
    """
    使用__doc__方法可以调用我
    """
    name="我是name类变量,我供给类方法调用,不能缺少我 如果类方法调用情况下 "
    def __init__(self,name):
        self.name=name  ## 区分类变量
        self.__food=None
        self.__status=0
        print(f'\033[1;31m 我被初始化了 \033[0m')

    def getDoc(self):
        print(f'\033[1;33m 本类的说明是: {self.__doc__}')

    @classmethod
    def iamClassMethod(self):
        """
        类方法只会调用类的类方法,比如name,只会调用类变量name,而不是实例化类的name方法
        :return:
        """
        print(f'In class Method:\n \t\033[1;34m {self.name}   注意我是类变量 \033[0m')
    @staticmethod
    def iamStaticMethod(self):
        """
        静态类方法 只调用对象name属性
        :param self:
        :return:
        """
        print(f'In static Method:\n \t \033[1;33m {self.name}   注意我是实例变量 \033[0m')

    @property  # attribute
    def eat(self):
        """
        吃的属性, 正在吃什么
        :return:
        """
        print(f'{self.name} is eating {self.__food}')

    ### 修改功能
    @eat.setter
    def eat(self, food):
        """
        属性可以被设置
        :param food:
        :return:
        """
        print("set to food:", food)
        self.__food = food ## 真正修改的地方

    ## 删除功能
    @eat.deleter
    def eat(self):
        """
        属性可以被删除
        :return:
        """
        del self.__food
        print(f'\033[3;32m 删完了 \033[0m')

    def checking_status(self):
        """
        开始检查飞行状态
        :return:
        """
        print(f"\033[3;34m \tchecking flight %s status ={self.__status} \033[0m")

    @property
    def flight_status(self):
        """
        根据当前的status值 返回飞行状态
        :return:
        """
        #self.__status = self.checking_status()
        if self.__status == 0 :
            print("flight got canceled...")
        elif self.__status == 1 :
            print("flight is arrived...")
        elif self.__status == 2:
            print("flight has departured already...")
        else:
            print("cannot confirm the flight status...,please check later")
    @flight_status.setter
    def flight_status(self,status):
        """
        obj.flight_status=3
        obj.flight_status=2
        obj.flight_status=1
        """
        self.__status=status ## 设置新状态
        print(f'\033[1;32m flight {self.name} has changed status to {status} \033[0m')

    def __call__(self):
        print(f'\033[3;35m 我被调用了 \033[0m')

    def __del__(self):
        print(f'\033[1;31m 我已经死去了 \033[0m')

## 3. 我们可以通过反射给类增加新的方法
## 通过字符串映射或修改程序运行时的状态、属性、方法, 有以下4个方法
#hasattr(obj, name_str), 判断一个对象obj里是否有对应的name_str字符串的方法
#getattr(obj, name_str), 根据字符串去获取obj对象里的对应的方法的内存地址
#setattr(obj, 'y', z), is equivalent
#delattr
def bulk(self):
    print("%s is yelling...." %self.name)

@property
def bulkPro(self):
    print("%s is numbbleing...." %self.name)


dragon1=Dragon("DragonFly")

## 反射开始
print(f'\033[0m 请输入你希望调用函数 , 我给你变出来 \033[0m \n')
choice = input(">>:").strip()
if hasattr(dragon1,choice):
    getattr(dragon1,choice)
else:
    setattr(dragon1,choice,bulk) #d.talk = bulk
    func = getattr(dragon1, choice)
    func(dragon1) ## 类似静态方法 需要填入对象

## 属性方法为注入成功!!
setattr(dragon1,"newProBulk",bulkPro)
dragon1.newProBulk
print(f'尝试调用注入的属性方法 {dragon1.newProBulk}')
## 反射结束
print(f'我正在调用类方法:\n Dragon.iamClassMethod()={Dragon.iamClassMethod()}')
print(f'我正在调用静态方法:\n Dragon.iamStaticMethod()={Dragon.iamStaticMethod(dragon1)}')
print(f'我正在调用属性方法:\n dragon1.eat={dragon1.eat}')
print(f'我正在调用属性方法:\n dragon1.flight_status={dragon1.flight_status}')
print(f'我正在修改 eat属性方法:\n ')
dragon1.eat="apple"
print(f'我正在修改flight_status的属性方法:\n ')
dragon1.flight_status=2

print(f'我正在调用修改后属性方法:\n dragon1.eat={dragon1.eat}')
print(f'我正在调用修改后属性方法:\n dragon1.flight_status={dragon1.flight_status}')
Related
叶昭良
叶昭良
Engineer of offshore wind turbine technique research

My research interests include distributed energy, wind turbine power generation technique , Computational fluid dynamic and programmable matter.