如何利用setattr()函数在应用程序运行时动态地设置对象属性

543 阅读5分钟

我们都知道,对象函数和函数构造器可以用来特指一个类的变量。setattr()方法是唯一可以替代这个方法的。在动态编程中,变量名不是静态的,setattr()方法很有帮助。点运算符在这种情况下是不适用的。以用户输入为例,它设置一个对象属性的值。使用 Python 中的 setattr() 函数为一个对象的属性赋值。它接受一个对象、一个字符串和一个未指定的值作为参数,但不提供任何输出。当我们希望给一个对象一个新的属性并为其赋值时,它是有用的。

在这篇文章中,你将获得有关 Python 的 setattr() 方法的知识,同时我们将介绍它的作用,何时采用它,以及何时它是不必要的。无论属性是否存在,该方法都是用来为一个对象定义一个属性的值。

Python 中 Setattr() 函数的语法

下面是我们在一个 Python 脚本中部署的 setattr() 语法:

setattr(set\_object, set\_variable, set\_value)

使用对象的参数名称、变量名称和值,将 object.attribute 参数设置为等值。这个函数没有抛出任何异常,因为任何对象属性都可以是某种类型。它向调用函数返回Nothing。

示例 1: 使用 Setattr() 函数的程序

setattr()方法显示了面向对象的编程在这些情况下仍能很好地工作,如果一个对象的属性在被使用时可以改变,那么它就非常有用。下面是演示setattr()函数工作的程序。

class Employee:  
Emp\_name ='Alice'  
my\_object = Employee()  
print(" Before setattr employee name : ", my\_object.Emp\_name)  
setattr(my\_object,'Emp\_name','Alice jeo')  
print("After setattr employee name : ", my\_object.Emp\_name)


在这个脚本中,我们首先建立了一个用 "Employee "这个名字表示的类。在这个指定的类中,我们创建了一个类变量为 "Emp_name"。类变量 "Emp_name "被设置为字符串值,即雇员的名字。然后,我们定义了一个对象为 "my_object "并调用了 "Employee "类。在setattr()函数部署之前,这里利用print来打印变量 "Emp_name "的值。

在setattr函数中,我们传递了三个输入:my_obeject、变量名 "Emp_name"、以及变量 "Emp_name "的修改值。然后,在最后一条打印语句中,我们打印了使用setattr()函数后的雇员姓名。

下面是前面的Python setattr()函数的脚本得到的结果:

例 2: 使用 Setattr() 函数属性的程序

这里,我们展示了 Python 中 setattr() 函数的属性:

class Animal:  
animal\_name ='Cat'  
obj1 = Animal()  
  
print("Before setattr name : ", str(obj1.animal\_name))  
  
setattr(obj1,'animal\_name', None)  
  
setattr(obj1,'detail','Persian kittens')  
  
print("After setattr animal name : "\+ str(obj1.animal\_name))  
print("After setattr animal detail : ", str(obj1.detail))


在前面的脚本中,我们定义了类,我们给它分配了 "动物 "的名字。在 "动物 "这个类中。我们定义了一个变量为 "animal_name",它被设置为动物名称 "cat "的字符串值。然后,我们有一个名为 "obj1 "的对象,"动物 "类被调用。然后,我们通过在setattr()函数前的str方法中传递该对象来打印它。

之后,setattr()函数被部署,其中 "obj1 "被传递。animal_name "变量也被传递,其值为 "none"。在这里,我们为新的属性部署了另一个 setattr() 函数,并且用新的值初始化了它。print 语句被提供用来在 setattr() 函数之后打印对象。

setattr()函数使用前后的结果显示在下面:

例 3: 使用 Dict 的 Setattr() 函数的程序

有能力同时设置许多属性是使用 setattr() 函数的一个好处。如果给你一个对象特征的字典,它将包含什么?要为一个对象的各种属性进行设置,你可以对它们进行循环:

class MyDictClass(object):  
def \_\_init\_\_(self, dict1):  
forkeyindict1:  
setattr(self, key, dict1\[key\])  
if\_\_name\_\_ =="\_\_main\_\_":  
  
dict1 ={"Student\_Name":"Edison",  
"Student\_ID":"3278",  
"Student\_Degree":"IT"}  
  
my\_result = MyDictClass(dict1)  
  
print("Dictionary转换为Class后:")  
print(my\_result.学生姓名, my\_result.Student\_ID, my\_result.Student\_Degree)  
print(type(my\_result))


在这个特殊的脚本中,我们首先定义了 "MyDictClass "类。我们向该类调用了对象。然后,我们定义了一个init方法,它以 "self "和 "dict1 "为参数。

之后,我们有一个 for 循环,在每个键和给定的 dictionary 的值上循环。然后我们部署了 setattr() 函数,在这个函数中加入 self、key 和 dict 的值。然后,在这个脚本的主函数中,我们创建了 dictionary。之后,我们在新创建的对象--"my_result "的帮助下,将该字典传递给 "MyDictClass "类。最后,我们打印了结果。

例4:使用Setattr()函数的程序,带有异常

在这里,我们将构建对象的只读属性。如果我们试图使用 setattr() 函数来改变属性的值,会产生一个异常:

class Product:  
  
def \_\_init\_\_(self):  
self.\_Function = None  
  
def Function(self):  
print('Function called')  
returnself.\_Function  
  
obj = property(Function, None)  
  
p1 = Product()  
  
setattr(p1,'obj',' laptop')


首先,我们将类定义为 "产品"。我们定义了 init 方法,其中 self 作为一个参数被提供给类。变量被创建为一个 "Function",其值被设置为无。然后,我们定义了之前的变量 "Function "的功能。

之后,我们创建了一个对象为 "obj",其中我们有一个属性名称为 "function"。在这个属性函数中,我们传递了变量 "Function "和它的值。setattr()函数被调用,我们向其提供了p1、obj和新值,并抛出了异常。

你可以看到,下面的异常是由前面的脚本引发的:

结论

这篇文章告诉我们如何利用setattr()函数在应用程序运行时动态地设置对象属性。当这些属性对开发者来说是未知的,并且一个 API 需要是灵活的,这对面向对象编程来说是一个非常有用的方法。你学会了如何使用 Python setattr() 函数为对象的属性赋值。你对用 setattr() 函数定义的知识也被清除了。然后,你学会了如何使用 setattr() 方法,同时用它来设置带有 Python 字典的属性。