码迷,mamicode.com
首页 > 编程语言 > 详细

Python类(四)-反射

时间:2018-01-28 00:05:57      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:self   分享   输入   ati   post   映射   asa   int   设置   

反射即通过字符串映射或修改程序运行时的状态、属性、方法

有4个方法:

hasattr():

hasattr(object,string):object为实例化的对象,string为字符串

判断对象object里是否有对应字符串string的方法或属性,返回布尔型

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

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

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

if __name__ == ‘__main__‘:
    p = Person(‘John‘) #实例化Person类
    argu = input(">>>:").strip()
    print(hasattr(p,argu))

 运行,输入name

类中有name这个属性,返回True

技术分享图片

输入eat

类中有eat这个方法,返回True

技术分享图片

输入test

类中没有test这个属性和方法,返回False

技术分享图片

getattr():

getattr(object,string[,default]):object为实例化的对象,string为字符串,default为默认值

根据字符串string来获取对象object中的方法或属性,如果对象object中没有字符串string的属性或方法,就会返回default的值,如果不设置default的值,将会报错

获取类中方法并调用

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

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

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

if __name__ == ‘__main__‘:
    p = Person(‘John‘)
    argu = input(">>>:").strip()
    if hasattr(p,argu):
        getattr(p,argu)(‘meat‘)

 执行结果

技术分享图片

获取类中属性的值

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

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

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

if __name__ == ‘__main__‘:
    p = Person(‘John‘)
    argu = input(">>>:").strip()
    print(getattr(p,argu))

技术分享图片

如果字符串不是类中的属性,则返回规定的默认值

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

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

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

if __name__ == ‘__main__‘:
    p = Person(‘John‘)
    argu = input(">>>:").strip()
    print(getattr(p,argu,"test"))

 输入a,类中没有a这个属性,则返回规定的默认值test

技术分享图片

setattr():

setattr(object,string,value):object为实例化的对象,string为字符串,value为值

setattr()用来设置方法或属性

把传入的字符串string设置为value名的函数,再通过getattr()来调用

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

class Person(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)

if __name__ == ‘__main__‘:
    p = Person(‘John‘)
    argu = input(">>>:").strip()
    setattr(p,argu,talk) #把传入的字符串设置为talk函数
    getattr(p,argu)(p) #把实例化的对象传入函数中

 运行,输入a

技术分享图片

调用的不是talk()函数,而是设置为talk()函数的字符串a

setattr()设置属性

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

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

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

if __name__ == ‘__main__‘:
    p = Person(‘John‘)
    argu = input(">>>:").strip()
    setattr(p,argu,‘Man‘) #设置属性
    print(getattr(p,argu))

传入的字符串string,如果不是类中的属性,将给类创建新属性string,并赋值value给新属性

技术分享图片

传入的字符串string,如果是类中的属性,value将覆盖原有的属性

技术分享图片

delattr():

delattr(object,string):删除object对象中的string属性

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

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

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

if __name__ == ‘__main__‘:
    p = Person(‘John‘)
    argu = input(">>>:").strip()
    delattr(p,argu)
    print(getattr(p,argu))

 运行,输入name

技术分享图片

报错,Person类中没有了name属性

Python类(四)-反射

标签:self   分享   输入   ati   post   映射   asa   int   设置   

原文地址:https://www.cnblogs.com/sch01ar/p/8367492.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!