python起源反射一说
python所有对象起源于type,由此开启了本篇blog的三个部分
- type生成万事万物
- 类方法(只使用类变量)、静态方法(只使用实例变量)、属性方法(删除 修改)
- 反射注入
# *
# * @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