欢迎来到十九分快乐的博客

生死看淡,不服就干。

7.类中方法 - property - 反射

类中方法 - 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("没有该方法")
posted @ 2020-12-22 23:58  十九分快乐  阅读(55)  评论(0编辑  收藏  举报