Python-面向对象之反射

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python-面向对象之反射相关的知识,希望对你有一定的参考价值。

反射

  实现了动态的装配,通过字符串来反射类中的属性和方法。

一、hasarttr(obj,name_str)

作用:判断一个对象obj中是否有对应的name_str字符串的属性或者方法。

class Dog(object):
    def __init__(self, name):
        self.name = name

    def eat(self, food):
        print("%s is eating %s" % (self.name, food))


d = Dog("Tom")
d.eat(‘Apple‘)
choice = input(">>>:").strip()

print(hasattr(d, choice))  # obj中是否有对应的choice字符串的属性或者方法

# # 输出
# >>>:name  # 输入对象存在属性
# True
# >>>:eat  # 输入对象存在的方法
# True

二、getattr(obj,name_str)

作用:根据字符串name_str获取obj对象中的对应方法的内存地址或者对应属性的值。

 

class Dog(object):
    def __init__(self, name):
        self.name = name

    def eat(self, food):
        print("%s is eating %s" % (self.name, food))


d = Dog("Tom")
d.eat(‘Apple‘)
choice = input(">>>:").strip()

print(getattr(d, choice))    # 获取d对象中的对应方法的内存地址或者对应属性的值

# >>>:name  # 获取输入对象的值
# Tom
# >>>:eat   # 获取输入对象的方法
# <bound method Dog.eat of <__main__.Dog object at 0x000002A4ADB732E8>>

 

三、setattr(x,y,z)

作用:给obj对象添加一个新属性或者新方法,setattr(x, ‘y‘, v) is equivalent to ``x.y = v‘‘。

1、给对象新增一个新方法

 

def bulk(self):  # 先定义一个bulk函数
    print("%s is yelling..." % self.name)


class Dog(object):
    def __init__(self, name):
        self.name = name

    def eat(self, food):
        print("%s is eating %s" % (self.name, food))


d = Dog("Tom")
choice = input(">>>:").strip()

setattr(d, choice, bulk)  # 输入的是talk,所以又等同于d.talk = bulk
# d.talk(d) 直接写死,用d.talk(d),一般不这么写
func = getattr(d, choice)  # 用getattr来获取
func(d)

# 输出
# >>>:talk
# Tom is yelling...

 

2、给对象新增一个属性

class Dog(object):
    def __init__(self, name):
        self.name = name

    def eat(self, food):
        print("%s is eating %s" % (self.name, food))


d = Dog("Tom")
choice = input(">>>:").strip()

setattr(d, choice, ‘Apple‘)  # food,所以又等同于d.food = ‘Apple‘
# print(d.food) 这样就写死了,还是用下面一种
print(getattr(d, choice))

# 输出
# >>>:food
# Apple

四、delattr(x,y)

作用:删除obj对象中的属性或者方法,delattr(x, ‘y‘) is equivalent to ``del x.y‘‘

class Dog(object):
    def __init__(self, name):
        self.name = name

    def eat(self, food):
        print("%s is eating %s" % (self.name, food))


d = Dog("Tom")
choice = input(">>>:").strip()

delattr(d, choice)  # 根据字符串删除属性或者方法
print(d.name)
print(d.eat)

五、综合使用hasattr、getattr、setattr

class Dog(object):
    def __init__(self, name):
        self.name = name

    def eat(self, food):
        print("%s is eating %s" % (self.name, food))


d = Dog("Tom")
choice = input(">>>:").strip()

if hasattr(d, choice):  # 判断d对象中存在属性和方法
    name_value = getattr(d, choice)  # 获取属性值
    print(name_value)
    setattr(d, choice, "Jerry")  # 修改属性值
    print(getattr(d, choice))  # 重新获取属性的值
else:
    setattr(d, choice, None)  # 设置不存在的属性值为None
    v = getattr(d, choice)
    print(v)

 

以上是关于Python-面向对象之反射的主要内容,如果未能解决你的问题,请参考以下文章

Python之面向对象-反射

Python面向对象之反射,双下方法

python之面向对象之反射运用

Python系列之反射面向对象

Python-面向对象之反射

Python面向对象之反射