python之路之前没搞明白8面向对象(反射,非常重要)

Posted 王大桃zzZ

tags:

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

反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

  一句话解释:通过字符串的形式操作对象相关的属性

 四个函数:

方法 作用
hasattr(*args, **kwargs)

返回对象里面是否有这个属性

*args:目标实例、对象。eg:p, Person

**kwargs:属性的名字,以字符串形式输入。eg:‘name‘

getattr(object, name, default=None)

获取对象里面的方法

object:目标实例或者方法

name:方面的名字,用字符串形式输入。eg:“walk”

default:不知道啥意思

setattr(x, y, v)--> x.y=z

设置一个属性,还可以赋值

1、新设一个属性,绑定到实例上

2、新设一个方法,绑定到实例上,调用时要传参(self)

3、新设一个方法,绑定到类上,调用时不需传参(self)

delattr(x, y) --> del x.y  删除一个属性 等同于 del object.attr

 示例:

class Person():
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def walk(self):
        print(walking)

if __name__ == __main__:
    p = Person(alex,24)
    #反射、映射、自省
    # hasattr 判断是否有这个方法
    if hasattr(p,name):
        print(ddd)
    # getattr 获取这个方法
    user_comm = input(>>:).strip()
    if hasattr(p,user_comm):
        func = getattr(p,user_comm)
        func()
    # setattr 赋值
        # 1设立一个属性,绑定到p上
    setattr(p,sex,F)
    print(p.sex)
        # 2写个新方法,绑定到实例p上
    def talk(self):
        print(talking)
    setattr(p,talk1,talk)
    p.talk1(p) #需要将实例作为参数传入
        # 3方法绑定到类上
    setattr(Person,talk2,talk)
    p.talk2() #不用传实例作为参数
    # delattr
    delattr(p,age) # = del p.age
    p.age # AttributeError: ‘Person‘ object has no attribute ‘age‘ 删了就没有这个属性,当然会报错

 

以上是关于python之路之前没搞明白8面向对象(反射,非常重要)的主要内容,如果未能解决你的问题,请参考以下文章

python之路之前没搞明白4面向对象(封装)

python之路之前没搞明白的6面向对象(编程思路及步骤)

Python全栈之路----面向对象开发----反射

python 面向对象之路 方法和函数 反射

Python之路第十二篇:Python面向对象高级

Python之路,Day8 - 面向对象编程进阶