面向对象--反射

什么是反射

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

python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

下列方法适用于类和对象(一切皆对象,类本身也是一个对象)

1)hasattr:可以查看前面的元素是否拥有后面的元素,后面的元素要用引号包裹,前面不需要。

但是这里必须要实例化,如果是hasattr(Foo,‘name’)报False.

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

    def func(self):
        print(‘yes‘)
l1=Foo(‘egon‘,19)
print(hasattr(l1,‘age‘))
l2=getattr(l1,‘age‘)
print(l2)
print(int(getattr(l1,‘age‘))-20)
print(hasattr(l1,‘Foo‘))

2)getattr:   根据括号的元素拿到相应的值,getattr(l1,l2),也就是如果后面的元素属于前面,那么会取出l1.l2的值。如果不是那就报错。

class Foo(object):
    staticField = "old boy"
    def __init__(self):
        self.name = ‘wupeiqi‘
    def func(self):
        return ‘func‘
    @staticmethod
    def bar():
        return ‘bar‘
print(getattr(Foo, ‘staticField‘))
print(getattr(Foo, ‘func‘))
print(getattr(Foo, ‘bar‘))

实例化能得到结果,不实例化就指挥显示内存地址。

class Foo(object):
    staticField = "old boy"
    def __init__(self):
        self.name = ‘wupeiqi‘
    @staticmethod
    def func():
        return ‘func‘
    @classmethod
    def bar(cls):
        return ‘bar‘
print(getattr(Foo, ‘staticField‘))
l1=getattr(Foo, ‘func‘)
l2=getattr(Foo, ‘bar‘)
print(l1())
print(l2())

这里有staticmethod使得getattr()里面Foo得以实现

这里还有一个sys模块调用的方法。

import sys

def s1():
    print ‘s1‘

def s2():
    print ‘s2‘

this_module = sys.modules[__name__]

hasattr(this_module, ‘s1‘)
getattr(this_module, ‘s2‘)

3)

__str__和__repr__

改变对象的字符串显示__str__,__repr__

自定制格式化字符串__format__

class Foo:
    def __init__(self,name):
        self.name = name
    def __str__(self):
        return ‘%s obj info in str‘%self.name
    def __repr__(self):
        return ‘obj info in repr‘

f = Foo(‘egon‘)
print(f)
print(‘%s‘%f)
print(‘%r‘%f)
print(repr(f))  # f.__repr__()
print(str(f))这里不管是__str__还是__repr__都是要return 的值,没有则会报错。
#当打印一个对象的时候,如果实现了str,打印中的返回值#当str没有被实现的时候,就会调用repr方法#但是当你用字符串格式化的时候 %s和%r会分别去调用__str__和__repr__#不管是在字符串格式化的时候还是在打印对象的时候,repr方法都可以作为str方法的替补#但反之不行#用于友好的表示对象。如果str和repr方法你只能实现一个:先实现repr
时间: 2024-11-03 05:40:07

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

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

面向对象:反射和双下方法 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

面向对象 反射 特殊方法

发射 反射的概念是由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

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

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

Day8 面向对象反射

反射:通过字符串来访问到所对应的值(反射到真实的属性上). eg: 1 class Foo: 2 x=1 3 def __init__(self,name): 4 self.name=name 5 6 def f1(self): 7 print('from f1') 8 9 10 # print(Foo.x) #Foo.__dict__['x'] 11 12 f=Foo('egon') 13 # print(f.__dict__) 14 # 15 # #1: 16 # print(f.name)

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;

Python基础day-22[面向对象:反射,其他命令参数]

反射: 什么是反射: 主要是指程序可以访问,检测和修改本身状态或行为的一种能力. Python中的一切事物都是对象. 四个实现自省的函数: 类和对象均可以使用. class A: name = 'abc' age = 19 #类的使用 print(hasattr(A,'n1me')) #判断类是否含有某个属性 hasattr(类或者对象名,属性名) print(getattr(A,'name')) #获取对应属性的属性值 getattr(类或者对象名,属性名,出错返回的内容) <----出错返回

面向对象——反射

反射:通过字符串的形式操作对象相关的属性,python中一切皆对象(都可以使用反射) hasattr(object,name):判断object中有没有一个name字符串对应的方法或属性 getattr(object, name, default=None) 1 def getattr(object, name, default=None): # known special case of getattr 2 """ 3 getattr(object, name[, defa