day7面向对象--反射

反射

通过字符串映射或修改程序运行时的状态、属性、方法, 有以下4个方法

    1、getattr(object, name[, default]) -> value

Get a named attribute from an object; getattr(x, ‘y‘) is equivalent to x.y.
    When a default argument is given, it is returned when the attribute doesn‘t
    exist; without it, an exception is raised in that case.

判断类中是否有指定的方法,如下:

class Dog(object):

    def __init__(self,name):
        self.name = name

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

d = Dog("alex")
choice = input(">>:").strip()    #用户输入函数,判断函数是否存在,存在执行,反射来判断执行
print(hasattr(d,choice))运行如下:>>:talkFalse>>:eatTrue

我们知道,有时候我们要根据用户输入来判断类中是否有某种方法,这样我们就能执行了。如何去判断呢?可以使用hasattr(object,name)方法。上面,我们实现了动态判断方法,如果存在返回True,否则返回False。

    2、getattr(object, name[, default]) -> value
    Get a named attribute from an object; getattr(x, ‘y‘) is equivalent to x.y.
    When a default argument is given, it is returned when the attribute doesn‘t
    exist; without it, an exception is raised in that case.

class Dog(object):

    def __init__(self,name):
        self.name = name

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

d = Dog("alex")
choice = input(">>:").strip()    #用户输入函数,判断函数是否存在,存在执行,反射来判断执行
print(getattr(d,choice))运行结果如下:>>:tallTraceback (most recent call last):  File "/home/zhuzhu/第七天/get_attr.py", line 11, in <module>    print(getattr(d,choice))AttributeError: ‘Dog‘ object has no attribute ‘tall‘>>:eat<bound method Dog.eat of <__main__.Dog object at 0x7fecf92428d0>>

从上面可以看出,getattr()是获取属性的内存地址,如果存在返回内存地址,如果不存在,则返回错误,提示类中不存在这个方法。

既然getattr()存在放回方法的内存地址,那么加上括号执行一下,如下:

class Dog(object):

    def __init__(self,name):
        self.name = name

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

d = Dog("alex")
choice = input(">>:").strip()    #用户输入函数,判断函数是否存在,存在执行,反射来判断执行
getattr(d,choice)()运行结果如下:>>:eatalex is eating......

从上面可以看出,程序正常执行了,通过上面,我们可以发现,hasattr()和getattr()经常结合一起使用,hasattr()判断是否有这个方法,而getattr()用来执行。如果存在,则调用getattr()进行执行。如下:

class Dog(object):

    def __init__(self,name):
        self.name = name

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

d = Dog("alex")
choice = input(">>:").strip()    #用户输入函数,判断函数是否存在,存在执行,反射来判断执行
if hasattr(d,choice):
    ‘‘‘这种场景在很多情况下都使用,比如让用户输入某个功能,如果存在执行,不存在则告诉用户没有这个功能‘‘‘
    getattr(d,choice)()

else:
    print("您输入的方法不存在,请核对后重新输入:")运行结果如下:>>:eat       #存在执行方法alex is eating......>>:tall      #不存在,提示方法没有您输入的方法不存在,请核对后重新输入

从上面代码可以看出,能够实现动态用户输入判断方法是否存在,存在执行,不存在提示的功能。

下面是实现带参数的情况:

class Dog(object):

    def __init__(self,name):
        self.name = name

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

d = Dog("alex")
choice = input(">>:").strip()    #用户输入函数,判断函数是否存在,存在执行,反射来判断执行
if hasattr(d,choice):
    ‘‘‘这种场景在很多情况下都使用,比如让用户输入某个功能,如果存在执行,不存在则告诉用户没有这个功能‘‘‘
    func = getattr(d,choice)
    func("chenronghua")
    #getattr(d,choice)("chenronghua")

else:
    print("您输入的方法不存在,请核对后重新输入:")运行结果如下:>>:eatalex is eating......chenronghua

   也可以判断属性是否存在,如下,就判断里面单纯的属性,得到属性值:

class Dog(object):

    def __init__(self,name):
        self.name = name

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

d = Dog("alex")
choice = input(">>:").strip()    #用户输入函数,判断函数是否存在,存在执行,反射来判断执行
if hasattr(d,choice):
    ‘‘‘这种场景在很多情况下都使用,比如让用户输入某个功能,如果存在执行,不存在则告诉用户没有这个功能‘‘‘
    func = getattr(d,choice)
    print(func)
    # func("chenronghua")
    #getattr(d,choice)("chenronghua")

else:
    print("您输入的方法不存在,请核对后重新输入:")运行结果如下:>>:namealex

    3.setattr(obj, name, value, /)
    Sets the named attribute on the given object to the specified value.
    
    setattr(x, ‘y‘, v) is equivalent to ``x.y = v‘‘
    添加动态属性:

class Dog(object):

    def __init__(self,name):
        self.name = name

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

def talk(self):
    print("%s is talking....." %self.name)

def laugh(self):
    print("%s is laughing....." %self)

d = Dog("alex")
choice = input(">>:").strip()    #用户输入函数,判断函数是否存在,存在执行,反射来判断执行
if hasattr(d,choice):
    ‘‘‘这种场景在很多情况下都使用,比如让用户输入某个功能,如果存在执行,不存在则告诉用户没有这个功能‘‘‘
    func = getattr(d,choice)
    print(func)
    # func("chenronghua")
    #getattr(d,choice)("chenronghua")

else:
    #setattr(d,choice,laugh)     #动态添加一个属性
    setattr(d,"alex","sb")      #动态加入一个属性
    print(getattr(d,"alex"))运行结果如下:>>:alexsb

添加动态方法:

class Dog(object):

    def __init__(self,name):
        self.name = name

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

def talk(name):
    print("%s is talking....." %name)

def laugh(self):
    print("%s is laughing....." %self)

d = Dog("alex")
choice = input(">>:").strip()    #用户输入函数,判断函数是否存在,存在执行,反射来判断执行
if hasattr(d,choice):
    ‘‘‘这种场景在很多情况下都使用,比如让用户输入某个功能,如果存在执行,不存在则告诉用户没有这个功能‘‘‘
    func = getattr(d,choice)
    print(func)
    # func("chenronghua")
    #getattr(d,choice)("chenronghua")

else:
    setattr(d,choice,laugh)     #动态添加一个属性
    #setattr(d,"alex","sb")      #动态加入一个属性
    print(getattr(d,choice)("alex"))

其实,setattr(obj,name_str,属性/方法)就是把一个属性/方法赋值给name_str,如果第三参数是一个方法,那么就赋值了一个方法给name_str,如果第三参数是一个属性,那么就赋值一个属性给name_str,是属性,使用getattr(obj,name_str)得到的是一个字符串;是方法,使用get(obj,name_str)得到的是一个方法的内存地址,其实本质还是上面的getattr(),方法就要看是否有参数,有参数就加入参数调用执行,没有参数就直接加括号执行。

    4.delattr(obj, name, /)
    Deletes the named attribute from the given object.
    
    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))

def talk(name):
    print("%s is talking....." %name)

def laugh(self):
    print("%s is laughing....." %self)

d = Dog("alex")
choice = input(">>:").strip()    #用户输入函数,判断函数是否存在,存在执行,反射来判断执行
if hasattr(d,choice):
    ‘‘‘这种场景在很多情况下都使用,比如让用户输入某个功能,如果存在执行,不存在则告诉用户没有这个功能‘‘‘
    func = getattr(d,choice)
    print(func)
    # func("chenronghua")
    #getattr(d,choice)("chenronghua")

else:
    setattr(d,choice,laugh)     #动态添加一个属性
    #setattr(d,"alex","sb")      #动态加入一个属性
    getattr(d,choice)("alex")
    delattr(d,choice)            #删除属性或者方法
    getattr(d, choice)("alex")

delattr(obj,name_str)删除实例中的方法或者属性。

    反射:

hasattr(obj,attr),判断一个对象里是否有对应的字符串的方法

getattr(obj,name_str),根据字符串去获取obj对象里对应的方法的内存地址。

setattr(obj,name_str,z)等价于obj.name_str = z

delattr(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))

def talk(name):
    print("%s is talking....." %name)

def laugh(self):
    print("%s is laughing....." %self)

d = Dog("alex")
choice = input(">>:").strip()    #用户输入函数,判断函数是否存在,存在执行,反射来判断执行
set_what = input("把那个变量赋值给属性:").strip()

if hasattr(d,choice):
    getattr(d,choice)
else:
    setattr(d,choice,laugh)
    v = getattr(d,choice)
    if type(v) == str:
        print(v)
    else:
        print(v("alex"))运行结果如下:>>:alex把那个变量赋值给属性:sbalex is laughing.....None

上面实例是对setattr()的进一步补充,其实就是设置属性或者方法。

时间: 2024-12-15 07:11:06

day7面向对象--反射的相关文章

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

本节内容 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业开发一个支持多用户在线的FTP程序 面向对象高级语法部分 静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法什么是静态方法呢其实不难理解普通的方法可以在实例化后直接调用并且在方法里可以通过self.调用实例变量或类变量但静态方法是不可以访问实例变量或类变量的一个不能访问实例变量和类变量的方法其实相当于跟类本身已经没什么关系了它与类唯一的关联就是需要通过

面向对象:反射和双下方法

面向对象:反射和双下方法 1.元类type type:获取对象从属于的类 class A: pass obj = A() print(type(A)) print(type('abc')) print(type([1,2,3])) python中一切皆对象,类在某种意义上也是一个对象,python中自己定义的类,以及大部分内置类都是由type元类(构建类)实例化得来的 type 与 object 的关系 object类是type类的一个实例,object类是type的父类. print(type

python小白-day7 面向对象高级部分

python 面向对象(进阶篇) 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员以及类的反射. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份. 一.字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同. 普通字段属于对象 静态字段属于类 1 2 3 4 5

面向对象--反射

什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩. python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) 1)hasattr:可以查看前面的元素是否拥有后面的元素,后面

day7 面向对象进阶

面向对象高级语法部分 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法. class SchoolMember(object): def __init__(self,name,age,sex):

Day7 - 面向对象高级语法

参考文章:http://www.cnblogs.com/alex3714/articles/5213184.html 本节内容: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊成员方法 反射 静态方法                                                                                   通过 @staticmethod 装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可

面向对象 反射 特殊方法

发射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩. python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) getattr() hasattr() se

Python之面向对象-反射

一.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问,检测和修改它本省状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩. python面向对象中的反射:通过字符串的形式操作对象相关的属性.Pythonn中的一切事物都是对象(都可以使用反射) 反射四种方法 一切皆对象,类本身也是一个对象 hasattr def hasattr(*args, **kwarg

面向对象 反射方法

首先看一个例子 #在面向对象中一般情况下怎么去调属性class Student: def __init__(self, name, age): self.name = name self.age = age def run(self): print('=========>') class Teacher(Student): pass stu1 = Student('zhuyu', 19) print(stu1.name) #其本质就是 stu1.__dict__['name'] print(st