面向对象-反射

反射

python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

1.反射的4种用法:

  1. 判断object中有没有一个name字符串对应的方法或属性(hasattr)
  2. 对属性的增加修改的方法(setattr)
  3. 对属性的删除方法(delattr)
  4. 对属性的查询方法(getattr)

1.判断object中有没有一个name字符串对应的方法或属性(hasattr)

class Foo:
    x = 10
    def __init__(self,name):
        self.name = name

    def say_info(self):
        print("say hello %s" % self.name)

f = Foo("xiaoming")
print(f.__dict__["name"])
print(hasattr(f,"name"))

# 也可以获取 类中的其他属性是否存在;
print(hasattr(f,"say_info"))
print(hasattr(f,"x"))

输出:

xiaoming
True
True
True

2.对属性的增加修改的方法(setattr)

class Foo:
    x = 10
    def __init__(self,name):
        self.name = name

    def say_info(self):
        print("say hello %s" % self.name)

f = Foo("xiaoming")

print(f.__dict__)
setattr(f,"age",18)
print(f.__dict__)

输出:

{'name': 'xiaoming'}
{'age': 18, 'name': 'xiaoming'}

3.对属性的查询方法(getattr)

class Foo:
    x = 10
    def __init__(self,name):
        self.name = name

    def say_info(self):
        print("say hello %s" % self.name)

f = Foo("xiaoming")

# 对数据进行获取,如果有就返回获取的值,没有可以设置第三值或None
print(getattr(f,"name",None))
print(getattr(f,"abcd",None))

输出:

xiaoming
None

4.对属性的删除方法(delattr)

class Foo:
    x = 10
    def __init__(self,name):
        self.name = name

    def say_info(self):
        print("say hello %s" % self.name)

f = Foo("xiaoming")
setattr(f,"age",18)

print(f.__dict__)
# 删除name这个属性方法
delattr(f,"name")
print(f.__dict__)

输出:

{'name': 'xiaoming', 'age': 18}
# 删除后只剩下age
{'age': 18}

2.将用户输入的命令,通过反射的方法映射到相应的函数方法上:

1 . 通过反射,用户输入的内容来执行相应的方法

class FtpServer:
    def __init__(self,host,port):
        self.host = host
        self.port = port

    def run(self):
        while True:
            cmd = input(">>>:").strip()
            if not cmd:continue
            # 注释方法也行
            # getcmd = getattr(self,cmd,None)
            # if not getcmd:continue
            # getcmd()
            if hasattr(self,cmd):
                func = getattr(self,cmd)
                func()

    def get(self):
        print("this get!")

    def put(self):
        print("this put!!")
f = FtpServer("192.168.1.1","21")
f.run()

输出:

>>>:get
this get!
>>>:put
this put!!
原文地址:https://www.cnblogs.com/baolin2200/p/7407122.html