python之类里面的__dict__属性详解

1. __dict__属性介绍

在Python中,每个对象都可以访问一个特殊属性__dict__,这个属性是一个字典,包含了对象的所有属性和对应的值。__dict__属性可以帮助我们动态地操作对象的属性,以及获取和设置对象的属性值。

2. __dict__属性的使用方法

2.1 获取对象的属性

通过访问对象的__dict__属性,可以获取对象的所有属性及其对应的值。

class Person:

def __init__(self, name, age):

self.name = name

self.age = age

person = Person('John', 25)

print(person.__dict__)

运行上述代码,输出结果为:

{'name': 'John', 'age': 25}

可以看到,通过访问对象的__dict__属性,我们可以获取到对象person的所有属性及其对应的值。

2.2 设置对象的属性

除了获取对象的属性,通过访问对象的__dict__属性,还可以设置对象的属性值。

class Person:

def __init__(self, name, age):

self.name = name

self.age = age

person = Person('John', 25)

person.__dict__['name'] = 'Tom'

person.__dict__['age'] = 30

print(person.name) # 输出:Tom

print(person.age) # 输出:30

在上述代码中,我们直接通过修改对象的__dict__属性来改变对象的属性值。通过设置__dict__的键值对,我们可以修改对象的属性值。

2.3 动态添加属性

除了获取和设置对象的已有属性,通过__dict__属性还可以动态地添加新的属性。

class Person:

def __init__(self, name, age):

self.name = name

self.age = age

person = Person('John', 25)

person.__dict__['gender'] = 'Male'

print(person.gender) # 输出:Male

在上述代码中,我们通过设置__dict__的键值对,成功地为对象person添加了一个新的属性gender,并且可以通过对象的点语法来访问这个新属性。

3. __dict__属性的注意事项

3.1 __dict__属性的作用范围

__dict__属性只对普通的对象起作用,对于内建对象(如int、float、str等)以及一些特殊的对象(如classmethod、staticmethod等),并不支持__dict__属性。

x = 10

print(x.__dict__) # 报错:AttributeError: 'int' object has no attribute '__dict__'

print(int.__dict__) # 输出:{'__doc__': 'int([x]) -> integer\n\nConvert a number or string to an integer or return 0 if no arguments\nare given. If x is a number, return x.__int__(). For floating point\nnumbers, this truncates towards zero.\n', '__new__': <staticmethod object at 0x7f8cbfdeeb50>, '__class__': <class 'type'>, '__hash__': <method '__hash__' of 'int' objects>...

在上述代码中,我们尝试访问整数对象的__dict__属性时会报AttributeError错误。而对于内建对象int,可以访问其__dict__属性,但返回的是一个字典,包含了整数对象的一些方法和属性。

3.2 __dict__属性的效率问题

由于__dict__属性是一个字典,所以对于属性的访问和设置都需要进行哈希查找,这会造成一定的性能损耗。如果程序对性能要求较高,可以考虑使用固定的属性,而不是频繁使用__dict__属性来操作。

4. 总结

本文详细介绍了Python中类对象的__dict__属性的用法和注意事项,主要包括获取对象属性、设置对象属性和动态添加属性。通过__dict__属性,我们可以灵活地操作对象的属性,并且可以动态地为对象添加新的属性。

后端开发标签