Python - 面向对象编程 - 反射 hasattr、getattr、setattr、delattr (上)

简介: Python - 面向对象编程 - 反射 hasattr、getattr、setattr、delattr (上)

什么是反射


反射的概念是由 Smith 在 1982 年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)

 

Python 面向对象中的反射

  • 通过字符串的形式操作对象的属性
  • Python 中一切皆为对象,所以只要是对象都可以使用反射
  • 比如:实例对象、类对象、本模块、其他模块,因为他们都能通过 对象.属性 的方式获取、调用

 

反射中关键的四个函数

  • hasattr
  • getattr
  • setattr
  • delattr

 

hasattr

def hasattr(*args, **kwargs): 
    """
    Return whether the object has an attribute with the given name.
    This is done by calling getattr(obj, name) and catching AttributeError.
    """
    pass


  • 返回对象是否具有具有给定名称的属性
  • 这是通过调用  getattr(obj,name)并捕获AttributeError来完成的    

 

getattr

def getattr(object, name, default=None): 
    """
    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.
    """
    pass


  • 获取对象指定名称的属性
  • getattr(x , y) 等价写法 x.y
  • 当属性不存在,则返回 default 值,如果没有指定 default 就会抛出异常

 

setattr

def setattr(x, y, v):
    """
    Sets the named attribute on the given object to the specified value.
    setattr(x, 'y', v) is equivalent to ``x.y = v''
    """
    pass


  • 给指定对象的指定属性设置为值
  • setattr(x,y,v) 等价写法 x.y = v

 

delattr

def delattr(x, y): 
    """
    Deletes the named attribute from the given object.
    delattr(x, 'y') is equivalent to ``del x.y''
    """
    pass


  • 从指定对象中删除指定属性
  • delattr(x,y) 等价写法 del x.y

 

反射类的成员


class PoloBlog:
    sum = 0
    def __init__(self, name):
        self.name = name
    def test(self):
        print("====姓名==== ", self.name)


hasattr

blog = PoloBlog("小菠萝")
# hasattr
print(hasattr(blog, "name"))        # 实例对象-实例属性
print(hasattr(blog, "sum"))         # 实例对象-类属性
print(hasattr(PoloBlog, "sum"))     # 类对象-类属性
print(hasattr(PoloBlog, "name"))    # 类对象-实例属性
# 输出结果
True
True
True
False



getattr

# getattr
print(getattr(blog, "name"))  # 实例对象-实例属性
print(getattr(blog, "sum"))  # 实例对象-类属性
print(getattr(PoloBlog, "sum"))  # 类对象-类属性
print(getattr(PoloBlog, "name", "默认值"))  # 类对象-实例属性
# 输出结果
小菠萝
0
0
默认值


setattr

# 设置一个新的实例属性
setattr(blog, "age", 24)
# 设置一个新的实例方法
setattr(blog, "printNameAge", lambda self: f"姓名:{self.name} 年龄:{self.age}")
print(blog.__dict__)
print(blog.printNameAge(blog))
# 输出结果
{'name': '小菠萝', 'age': 24, 'printNameAge': <function <lambda> at 0x10391a1f0>}
姓名:小菠萝 年龄:24


delattr

# delattr
delattr(blog, "age")
delattr(blog, "printNameAge")
print(blog.__dict__)
# 输出结果
{'name': '小菠萝'}


反射本模块的成员


除了可以检测类中有没有某个属性、方法,还可以用来检测某个模块下有没有方法、类、变量

sums = 0
def test1():
    print("test")
class A():
    pass
this_module = sys.modules[__name__]
print(__name__)
print(this_module)
print(hasattr(this_module, "sums"))  # 变量
print(hasattr(this_module, "test1"))  # 方法
print(hasattr(this_module, "A"))  # 类
# 输出结果
__main__
<module '__main__' from '/Users/polo/Documents/pylearn/第四章:面向对象/22_反射.py'>
True
True
True
相关文章
Python编程作业五:面向对象编程
Python编程作业五:面向对象编程
【Python进阶(三)】——面向对象编程
【Python进阶(三)】——面向对象编程
|
Java C# Python
Python学习七:面向对象编程(中)
这篇文章是关于Python面向对象编程的中级教程,涵盖了析构函数、对象的三大特征(封装、继承、多态)、类属性与实例属性、以及类方法与静态方法的对比。
298 2
|
设计模式 安全 JavaScript
Python学习八:面向对象编程(下):异常、私有等
这篇文章详细介绍了Python面向对象编程中的私有属性、私有方法、异常处理及动态添加属性和方法等关键概念。
323 1
|
Python
全网最适合入门的面向对象编程教程:Python函数方法与接口-函数与方法的区别和lamda匿名函数
【9月更文挑战第15天】在 Python 中,函数与方法有所区别:函数是独立的代码块,可通过函数名直接调用,不依赖特定类或对象;方法则是与类或对象关联的函数,通常在类内部定义并通过对象调用。Lambda 函数是一种简洁的匿名函数定义方式,常用于简单的操作或作为其他函数的参数。根据需求,可选择使用函数、方法或 lambda 函数来实现代码逻辑。
362 7
|
Java Python
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
【9月更文挑战第18天】在 Python 中,虽无明确的 `interface` 关键字,但可通过约定实现类似功能。接口主要规定了需实现的方法,不提供具体实现。抽象基类(ABC)则通过 `@abstractmethod` 装饰器定义抽象方法,子类必须实现这些方法。使用抽象基类可使继承结构更清晰、规范,并确保子类遵循指定的方法实现。然而,其使用应根据实际需求决定,避免过度设计导致代码复杂。
274 6
|
存储 Java 程序员
30天拿下Python之面向对象编程
30天拿下Python之面向对象编程
131 3
|
Python
Python 中的面向对象编程 (OOP)
【8月更文挑战第29天】
307 7
|
机器学习/深度学习 PHP 开发者
探索PHP中的面向对象编程构建你的首个机器学习模型:以Python和scikit-learn为例
【8月更文挑战第30天】在PHP的世界中,面向对象编程(OOP)是一块基石,它让代码更加模块化、易于管理和维护。本文将深入探讨PHP中面向对象的魔法,从类和对象的定义开始,到继承、多态性、封装等核心概念,再到实战中如何应用这些理念来构建更健壮的应用。我们将通过示例代码,一起见证PHP中OOP的魔力,并理解其背后的设计哲学。
|
存储 Java C#
详解 Python 中的面向对象编程(2)
详解 Python 中的面向对象编程(2)
294 10

推荐镜像

更多