• setattr()函数与getattr()函数用法


    一、setattr函数

    setattrPython 内置函数之一,它用于动态设置对象的属性。其函数构成如下:

    setattr(object, attribute, value)
    
    • 1
    • object:要设置属性的对象。
    • attribute:要设置的属性的名称(字符串)。
    • value:要设置的属性的值。

    setattr 的主要用途是在运行时动态地为对象添加或修改属性。它通常用于以下几种情况:

    1. 动态创建对象属性

    可以在运行时根据需要为对象添加新的属性。例如:

    class Person:
        pass
    
    person = Person()
    setattr(person, "name", "John")
    setattr(person, "age", 30)
    print(person.name)  # 输出: John
    print(person.age)   # 输出: 30
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    或:

    class Person:
        def __init__(self,name,age):
            self.name=name
            self.age=age
    
            setattr(self, "gender", 'boy')# self代指当前对象
    
    person = Person("John",20)
    
    print(person.gender)# 输出:boy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2. 修改对象属性

    我们可以使用 setattr 修改对象已有的属性的值。例如:

    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    person = Person("Alice", 25)
    setattr(person, "age", 30)
    print(person.age)  # 输出: 30
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3. 用于动态创建类的属性

    除了对象,setattr 也可以用于设置类的属性。这对于动态创建类的属性非常有用。例如:

    class MyClass:
        pass
    
    setattr(MyClass, "class_variable", 42)
    print(MyClass.class_variable)  # 输出: 42
    
    • 1
    • 2
    • 3
    • 4
    • 5

    需要注意的是,虽然 setattr 具有灵活性,但滥用它可能会导致代码不易维护或理解。因此,通常建议在需要动态属性时慎重使用,以确保代码的清晰性和可维护性。

    二、getattr函数

    getattr 是另一个与属性相关的内置函数,它用于获取对象的属性值。其函数构成如下:

    getattr(object, attribute, default)
    
    • 1
    • object:要获取属性值的对象。
    • attribute:要获取的属性的名称(字符串)。
    • default:如果属性不存在时的默认值(可选参数)。

    getattr 的主要用途是在运行时获取对象的属性值,如果属性不存在,则可以提供一个默认值。

    以下是 getattr 的一些常见用法:

    1. 获取对象属性的值

    我们可以使用 getattr 来获取对象的属性值。如果属性存在,它将返回属性的值,否则会引发 AttributeError 异常。

    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    person = Person("Alice", 25)
    name = getattr(person, "name")
    age = getattr(person, "age")
    print(name)  # 输出: Alice
    print(age)   # 输出: 25
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2. 处理属性不存在的情况

    我们可以使用 getattr 的第三个参数来指定一个默认值,以防属性不存在。如果属性不存在,将返回指定的默认值。

    class Person:
        def __init__(self, name):
            self.name = name
    
    person = Person("Bob")
    age = getattr(person, "age", 30)  # 如果属性不存在,返回默认值 30
    print(age)  # 输出: 30
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    getattr 在需要动态获取属性值的情况下非常有用,尤其是当你不确定属性是否存在或希望提供默认值时。

    除了上面提到的常见用法,getattr 还可以用于以下情况:

    3. 获取模块中的函数或变量

    我们可以使用 getattr 来获取模块中定义的函数或变量的引用。这在需要根据字符串的内容来动态调用模块中的函数或访问模块中的变量时非常有用。

    import math
    
    function_name = "sqrt"
    sqrt_function = getattr(math, function_name)
    result = sqrt_function(16)
    print(result)  # 输出: 4.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4. 获取类方法或静态方法

    getattr 也可以用于获取类的方法,包括普通方法、类方法和静态方法。我们可以通过指定类名和方法名来获取方法的引用。

    class MyClass:
        def instance_method(self):
            return "This is an instance method"
    
        @classmethod
        def class_method(cls):
            return "This is a class method"
    
        @staticmethod
        def static_method():
            return "This is a static method"
    
    my_instance = MyClass()
    instance_method = getattr(my_instance, "instance_method")
    class_method = getattr(MyClass, "class_method")
    static_method = getattr(MyClass, "static_method")
    
    print(instance_method())  # 输出: This is an instance method
    print(class_method())     # 输出: This is a class method
    print(static_method())    # 输出: This is a static method
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    这些是 getattr 函数的一些常见用法,它可以在运行时根据字符串来获取对象的属性、模块中的函数或变量以及类的方法。这种动态性使得 Python 在某些情况下非常灵活和强大。

  • 相关阅读:
    MyBatis-Plus + Spring Boot入门案例
    java计算机毕业设计家庭财务管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署
    腾讯安全在2022:出租车、地铁和爆发的火山
    java面试题
    baby_web (攻防世界)
    自定义hooks函数
    【C++】class的设计与使用(一)实现一个class
    【硬件异常黑盒子功能】成功使用LUA小程序实现类似MDK的硬件检测机制,并且更进一步锁异常位置,支持脱机运行
    flink的安装与使用(ubuntu)
    todo-list案例(一) 静态组件
  • 原文地址:https://blog.csdn.net/thy0000/article/details/133690084