Python-面向对象之反射

反射

  实现了动态的装配,通过字符串来反射类中的属性和方法。

一、hasarttr(obj,name_str)

作用:判断一个对象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))

d = Dog("Tom")
d.eat(‘Apple‘)
choice = input(">>>:").strip()

print(hasattr(d, choice))  # obj中是否有对应的choice字符串的属性或者方法

# # 输出
# >>>:name  # 输入对象存在属性
# True
# >>>:eat  # 输入对象存在的方法
# True

二、getattr(obj,name_str)

作用:根据字符串name_str获取obj对象中的对应方法的内存地址或者对应属性的值。

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

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

d = Dog("Tom")
d.eat(‘Apple‘)
choice = input(">>>:").strip()

print(getattr(d, choice))    # 获取d对象中的对应方法的内存地址或者对应属性的值

# >>>:name  # 获取输入对象的值
# Tom
# >>>:eat   # 获取输入对象的方法
# <bound method Dog.eat of <__main__.Dog object at 0x000002A4ADB732E8>>

三、setattr(x,y,z)

作用:给obj对象添加一个新属性或者新方法,setattr(x, ‘y‘, v) is equivalent to ``x.y = v‘‘。

1、给对象新增一个新方法

def bulk(self):  # 先定义一个bulk函数
    print("%s is yelling..." % self.name)

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

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

d = Dog("Tom")
choice = input(">>>:").strip()

setattr(d, choice, bulk)  # 输入的是talk,所以又等同于d.talk = bulk
# d.talk(d) 直接写死,用d.talk(d),一般不这么写
func = getattr(d, choice)  # 用getattr来获取
func(d)

# 输出
# >>>:talk
# Tom is yelling...

2、给对象新增一个属性

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

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

d = Dog("Tom")
choice = input(">>>:").strip()

setattr(d, choice, ‘Apple‘)  # food,所以又等同于d.food = ‘Apple‘
# print(d.food) 这样就写死了,还是用下面一种
print(getattr(d, choice))

# 输出
# >>>:food
# Apple

四、delattr(x,y)

作用:删除obj对象中的属性或者方法,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))

d = Dog("Tom")
choice = input(">>>:").strip()

delattr(d, choice)  # 根据字符串删除属性或者方法
print(d.name)
print(d.eat)

五、综合使用hasattr、getattr、setattr

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

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

d = Dog("Tom")
choice = input(">>>:").strip()

if hasattr(d, choice):  # 判断d对象中存在属性和方法
    name_value = getattr(d, choice)  # 获取属性值
    print(name_value)
    setattr(d, choice, "Jerry")  # 修改属性值
    print(getattr(d, choice))  # 重新获取属性的值
else:
    setattr(d, choice, None)  # 设置不存在的属性值为None
    v = getattr(d, choice)
    print(v)
时间: 2024-12-24 08:12:48

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

Python面向对象之反射,双下方法

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

第三十四篇 Python面向对象之 反射(自省)

什么是反射? 反射的概念是由Smith在1982年提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成就. 四个可以实现自省的函数,是Python的内置函数 下列方法适用于类和对象 先看这四个方法对实例(b1)的使用 # 演示代码 class BlackMedium: feature = 'Ugly' def __init__(self, nam

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面向对象的反射:通过字符串的形式操作对象相关的属性. python中一切事物都是对象(都可以使用反射) 三:反射的好处 1实现可插拔机制 反射的好处就是,可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,即你可以事先把主要的逻辑写好(只定义接口),然后后期再去实现接口的功能 class FtpClient: 'ftp客户端,但是还么有实现具体的功能' def __init__(sel

Python之面向对象进阶------反射(Day26)

一 classmethod class Classmethod_Demo(): role = 'dog' @classmethod def func(cls): print(cls.role) Classmethod_Demo.func() staticmethod class Staticmethod_Demo(): role = 'dog' @staticmethod def func(): print("当普通方法用") Staticmethod_Demo.func() clas

Python开发基础----反射、面向对象进阶

isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象,如果是返回True 1 class Foo(object): 2 pass 3 obj = Foo() 4 print(isinstance(obj, Foo)) issubclass(sub, super)检查sub类是否是 super 类的派生类,如果是返回True 1 class Foo(object): 2 pass 3 cla

Python学习【第14篇】:面向对象之反射以及内置方法

面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被类调用,就像正常调用函数一样 类方法和静态方法的相同点:都可以直接被类调用,不需要实例化 类方法和静态方法的不同点: 类方法必须有一个cls参数表示这个类,可以使用类属性 静态方法不需要参数 绑定方法:分为普通方法和类方法 普通方法:默认有一个self对象传进来,并且只能被

Python面向对象反射,双下方法

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

python面向对象其他相关-异常处理-反射

1.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象   2.issubclass(sub, super) 检查sub类是否是 super 类的派生类 n1 = 10 a1 = "123" print type(n1) print type(a1) print isinstance(n1,int) #判断n1是否属于int类型,正确返回True print '-->',isinstance(n1,str) #判断n1是否属于str类型,正确返回Tr

python——面向对象篇之异常和反射

内置函数isinstance和issubclass 1.1 isinstance用法: 1 isinstance(string,str) 判断第一个参数是否是第二个参数的子集,例如: 1 print isinstance("test",str) #判断test是否是字符串类型 2 3 C:\Python27\python.exe D:/python/s11/8day/反射/test.py 4 5 True 6 7 8 print isinstance(123,int) #判断123是否