Python类(四)-反射

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

有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属性

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

时间: 2024-08-01 05:38:16

Python类(四)-反射的相关文章

python类的反射

反射 通过字符串映射或者修改程序运行时的状态.属性.方法, 有一下4个方法 小例子--根据用户输入调用方法: class Dog(object): def __init__(self,name): self.name = name def eat(self): print("%s is eating..",self.name) d= Dog('二哈') choice = input(">>:").strip() d.choice() =========执

Python类中反射的作用

#coding:utf-8 ''' #反射的基本用法: hasattr 判断一个方法是否存在于实例中 getattr 指定一个方法名字,获取该方法的内存地址,加"()"括号并可执行 ''' import sys class WebServer(object): def __init__(self,host,port): self.host = host self.port = port def start(self): print("Server is starting...

python 类 四 : 类的继承与覆盖父类方法

python 继承,子类可以覆盖父类的各种方法,包括__init__方法. 如果要覆盖父类的__init__方法,且希望在覆盖的方法中引用父类的__init__方法,比如在父类的__init__方法的基础上增加一些属性的设置或者其他. 则需要显示的引用父类的方法,否则,父类的方法不会被直接调用到的. 比如: #coding:utf-8 # c继承了p,并实现了自己的__init__方法,也就是重新实现了__init__方法,但为了减少代码冗余 # c在自己的__init__方法里面引用了p的__

第 7 天 python类的反射和socket编程

1 #!/user/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import sys 5 class WebServer(object): 6 def __init__(self,host,port): 7 self.host = host 8 self.port = port 9 10 def start(self): 11 print("Servser is starting....") 12 13 def stop(self): 14

Python类(四)-多态

多态即一个接口,多种实现 按照平常直接调用 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" class Person(object): def __init__(self,name): self.name = name class Student(Person): def talk(self): print('%s is studying'%self.name) class Teacher(Person): def talk(sel

Python 之 类的反射

类的反射作用 当一个类中,带有多个方法时,要求用户输入方法名,并调用相应函数,此时就可使用类的反射方法,来快速调用相应函数,而不再需要使用多个IF判断条件语句. 类的反射方法 hasattr(obj,name_str) 判断一个对象OBJ里是否有对应的name_str字符串的方法 getattr(obj,name_str) 根据字符串去获取obj对象里的对应方法的内存地址 setattr(obj,'y',z) 相当于 obj.y = 'v' delattr(obj,name_str) 删除一个对

Python 基础 四

今天我们先介绍一下反射这个概念,啥是反射?反射就是自己检测自己.在我们Python的面向对象中的反射是啥意思呢?就是通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 在Python中四个产生反射的函数,分别是:hasattr();getattr();setattr();delattr(); 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) hasattr((object, name, default=None)) 判断object中有没有一个name

Python面向对象之反射

首先,我们来看两个内置函数,isinstance和issubclass,前者是判断一个对象是不是相应的类型,比如: obj = 'python' print(isinstance(obj,str)) 判断obj是否为字符串类型,结果返回True 后者issubclass则判断一个类是否为另一个的子类,比如: class A:     pass class B(A):     pass print(issubclass(B,A)) 判断B是否为A的子类,结果返回True 反射:其实它的核心本质其实

python中的反射

在绝大多数语言中,都有反射机制的存在.从作用上来讲,反射是为了增加程序的动态描述能力.通俗一些,就是可以让用户参与代码执行的决定权.在程序编写的时候,我们会写很多类,类中又有自己的函数,对象等等.这些类和函数都是为了后序代码服务,程序员决定什么时候用到哪一个类,什么时候调用某个函数.但很多时候,我们需要根据用户的需求来决定执行哪一段代码块.用户可能是通过点击,输入数据,或者其他方式发出指令,反射则将用户的指令传递到需要执行的那一段代码块.这个过程是自动执行的,无需人工去核对用户指令是否应该执行那