类中方法 - property - 反射
1. 类中方法
# 类中方法
class Cat():
# 无参方法: 只能类来调用
def pashu():
print("小猫会爬树")
# 绑定方法: 1.绑定到对象,对象调用类中成员方法时,会自动传递对象参数
def eatfish(self):
print("小猫喜欢吃鱼")
# 绑定方法: 2.绑定到类,对象或者类调用类中成员方法时,会自动传递类参数
@classmethod
def sleep(cls):
print("小猫爱睡觉")
# 静态方法: 无论是对象还是类调用,系统都不会传递任何参数
@staticmethod
def jineng():
print("可以抓耗子")
obj = Cat()
# 1. 无参方法
# obj.pashu() 有错误
Cat.pashu() #小猫会爬树
# 2. 绑定到对象(对象调用自动传对象参数)
obj.eatfish() #小猫喜欢吃鱼
Cat.eatfish(obj) #小猫喜欢吃鱼
# 3.绑定到类(自动传递类参数)
obj.sleep() #小猫爱睡觉
Cat.sleep() #小猫爱睡觉
# 4.静态方法 (不传递任何参数)
obj.jineng() #可以抓耗子
Cat.jineng() #可以抓耗子
2. property
# property
"""
作用 : 可以把方法变成属性,动态的控制了该属性的获取,设置,删除三种操作;
获取数据时自动触发装饰器 @property
设置属性时自动触发装饰器 @函数名.setter
删除属性时自动触发装饰器 @函数名.deleter
要求: 获取,设置,删除的函数名必须一致,
"""
# 1.方法一:
class My():
def __init__(self,name):
self.name = name
@property
def func(self):
return self.name
@func.setter
def func(self,name):
self.name = name
@func.deleter
def func(self):
del self.name
obj = My("贾英贺") #实例化对象
# print(obj.name)
# 获取元素
print(obj.func) #贾英贺
# 设置元素
obj.func = "光头强"
print(obj.func) #光头强
# 删除元素
del obj.func
# print(obj.func) error
# 方法二:
class Me():
def __init__(self,name):
self.name = name
def get(self): #获取元素
return self.name
def sett(self,val): #设置元素
self.name = val
def dele(self): #删除元素
del self.name
# 必须按照顺序传参 :获取方法 ->设置方法 ->删除方法
username = property(get,sett,dele)
obj = Me("熊大")
print(obj.username)
obj.username = "吉吉"
print(obj.username)
del obj.username
# print(obj.username) error
3. 反射
# 反射
"""
概念 : 通过字符串取操控类对象,或者模块中的属性方法
"""
# 1.放射类对象中的成员
class My():
age = 11
def __init__(self, name):
self.name = name
def skin(self):
print("肤色号")
def eye(self):
print("眼睛好")
def __eat(self):
print(888)
obj = My("贾英贺")
# (1) hasattr(object,name) 检测对象或类是否有指定的成员(判断依据:查看是否可以被调用)
print(hasattr(obj, "name")) # True
print(hasattr(obj, "__eat")) # False 对象不能调用类中私有方法
print(hasattr(My, "age")) # True
# (2) getattr() 获取对象或类成员的值
print(getattr(obj,"name"))
# getattr(类/对象,成员,"设置默认值防止报错")
print(getattr(obj,"djl","出错了"))
# 通过类反射方法(反射出来的是普通函数)
func = getattr(My,"skin")
func(obj) # 调用时需要看类中方法是否有参数,有的话需要传递参数
# 通过对象反射方法(反射出来的是绑定方法)
func = getattr(obj,"eye")
func()
# (3) setattr() 设置对象或类成员的值
setattr(obj,"sex","未知") # 对象添加属性
print(obj.sex)
def func(): # 对象添加方法
print('aaaaaaa')
setattr(obj,'hehe',func)
obj.hehe()
setattr(My,"hh",lambda self:print("大家快来示范")) # 类添加方法
obj.hh()
# (4) delattr() 删除对象或类成员的值
delattr(My,"hh")
delattr(obj,"name")
# 实例:通过字符串操作对象或类中的成员
"""
strvar = input("你想要调用的方法:")
if hasattr(obj,strvar):
func = getattr(obj,strvar)
func()
else:
print("该方法不存在")
"""
# 2.反射模块中的成员
import sys
# sys.modules 返回的是系统的模块字典
print(sys.modules)
# 通过__main__字典的键,获取的是当前文件的模块对象
modules = sys.modules["__main__"]
def func1():
print(1111)
def func2():
print(2222)
def func3():
print(33333)
# 反射模块实例:通过字符串操作模块成员
while True:
strvar = input("请输入您想要使用的方法名:")
if hasattr(modules,strvar):
func = getattr(modules,strvar)
func()
elif strvar.upper() == "Q":
break
else:
print("没有该方法")