class中__dict__的理解,Python3

本文深入探讨Python中类和实例的属性管理机制,包括如何使用__dict__属性来查看和动态修改实例变量及方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class Friends():       #定义一个类

    def __init__(self):             

        self.name = 'wuq'         #两个实例变量

        self.gender = 'female'

    

def say_to_friend():     #有一个方法

        print('hello %s'%self.name)


if __name__ == '__main__':

    f = Friends()    #创建实例

    print(f.__dict__)     #输出为{'name':'wuq','gender':'female'}

    print(Friends.__dict__)

'''

输出一堆,

{'__modul__':'__main__','__init__':<function Friends.__init__ at 0x000000000022FE730>,...

'__doc__':None}所处模块...等


实际上,实例的__dict__仅存了与实例相关的实例属性.

实例的__dict__属性,也使得每个实例的实例属性不会相互影响,一个实例的实例属性就是和ta相关的那些属性.


f.message = 'hello my world'    #在外部添加一个实例属性   动态的添加一个属性

f.fun = lambda :x    #实例属性为一个函数

print(f.__dict__)    #输出则为{'name':'wuq','gender':'female','message':'hello my world','fun':<function <lambda> at 0x00000000001F8E7B8>}最后的fun,函数为对应的内存地址


实例的__dict__存有与实例相关的实例变量和函数.


类的__dict__则是和实例共享的变量,函数(方法,类属性).注意,类的__dict__并不包含其父类的属性.

比如,直接print(object.__dict__)

子类的__dict__中不包含父类的__dict__.

Python中,`__dict__`是一个特殊的属性,用于存储对象或类的可写属性(即实例变量或类变量)。它是一个字典,键是属性名(字符串),值是对应的属性值。`__dict__`提供了动态访问和修改对象属性的能力。 ### `__dict__`的常见用途 1. **实例的`__dict__`**: - 存储实例的属性(动态添加的实例变量)。 - 不包含类属性或方法(除非通过实例动态添加)。 - 示例: ```python class MyClass: class_var = "类变量" def __init__(self, value): self.instance_var = value obj = MyClass("实例值") print(obj.__dict__) # 输出: {&#39;instance_var&#39;: &#39;实例值&#39;} ``` 2. **类的`__dict__`**: - 存储类的属性(包括类变量、方法等)。 - 不包含继承的属性(除非显式访问)。 - 示例: ```python print(MyClass.__dict__) # 输出可能包含: # { # &#39;__module__&#39;: &#39;__main__&#39;, # &#39;class_var&#39;: &#39;类变量&#39;, # &#39;__init__&#39;: <function MyClass.__init__ at 0x...>, # &#39;__dict__&#39;: <attribute &#39;__dict__&#39; of &#39;MyClass&#39; objects>, # ... # } ``` 3. **动态添加/修改属性**: - 通过`__dict__`可以直接操作属性: ```python obj.__dict__["new_var"] = "动态添加" print(obj.new_var) # 输出: "动态添加" ``` ### 注意事项 1. **并非所有对象都有`__dict__`**: - 使用`__slots__`的类实例没有`__dict__`(为了节省内存)。 - 示例: ```python class SlottedClass: __slots__ = [&#39;x&#39;] sc = SlottedClass() sc.x = 10 print(hasattr(sc, &#39;__dict__&#39;)) # 输出: False ``` 2. **性能优化**: - 直接访问`__dict__`比通过点号(`.`)访问属性稍慢,因为后者经过优化。 3. **继承关系**: - 实例的`__dict__`不包含继承的属性,类的`__dict__`也不包含父类的属性(除非用`dir()`或`vars()`)。 ### 相关函数 - `vars(obj)`:返回对象的`__dict__`(等价于`obj.__dict__`)。 - `dir(obj)`:返回对象的所有属性(包括继承的,不仅限于`__dict__`)。 ### 示例代码 ```python class Person: species = "人类" # 类变量 def __init__(self, name): self.name = name # 实例变量 p = Person("Alice") print(p.__dict__) # 输出: {&#39;name&#39;: &#39;Alice&#39;} print(Person.__dict__) # 输出类属性和方法 # 动态添加属性 p.__dict__["age"] = 30 print(p.age) # 输出: 30 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值