gpt4 book ai didi

python - 类属性及其初始化

转载 作者:太空宇宙 更新时间:2023-11-03 13:16:02 24 4
gpt4 key购买 nike

我是 python 的新手,这些天我正在探索类(class)。我有一个关于类内属性和变量的问题:通过 q=1 定义属性有什么区别?在类的主体中并通过定义 self.q=1__init__里面?例如,下面两种可能性有什么区别?

class MyClass1:
q=1
def __init__(self,p):
self.p=p
def AddSomething(self,x):
self.q = self.q+x

class MyClass2:
def __init__(self,p):
self.q=1
self.p=p
def AddSomething(self,x):
self.q = self.q+x

例如输出:

>>> my=MyClass1(2)
>>> my.p
2
>>> my.q
1
>>> my.AddSomething(7)
>>> my.q
8

不取决于是否MyClass1MyClass2用来。都不在MyClass1也不在 MyClass2是否发生错误。

最佳答案

Python 中的类及其实例使用类似字典的数据结构来存储信息。

因此对于每个类定义,将分配一个字典来存储类级别信息(类变量)。对于该特定类的每个实例,将分配一个单独的字典(self),其中将存储实例特定信息(实例变量)。

那么现在下一个问题是:如何查找特定名称??

这个问题的答案是,如果您通过某个实例访问名称,将首先搜索特定于实例的字典,如果在那里找不到该名称,则将在类字典中搜索该名称。因此,如果在两个级别定义了相同的值,则前一个将被覆盖。

请注意,当您编写 d['key'] = val 时,其中 d 是字典,如果 'key' 不存在,它将自动添加到字典中。否则当前值将被覆盖。在阅读进一步的解释之前,请记住这一点。

现在让我们看一下您用来描述问题的代码:

MyClass1

class MyClass1:
q=1
def __init__(self,p):
self.p=p
def AddSomething(self,x):
self.q = self.q+x

1. my = Myclass1(2) #create new instance and add variables to it.

MyClass = {"q" : 1}
my = {"p" : 2}

2. my.p    # =2, p will be taken from Dictionary of my-instance.

3. my.q    # =1, q will be takn from MyClass dict. (Not present in dictionary of my-instance).

4. my.AddSomething(7) # This method access the value of q (using self.q) first 
# which is not defined in my dict and hence will be taken
# from dictionary of MyClass. After the addition operation,
# the sum is being stored in self.q. Note that now we are
# adding the name q to Dictionary of my-instance and hence
# a new memory space will be created in Dictionary of my-instance
# and the future references to self.q will fetch the value
# of self.q from dictionary of my-instance.

MyClass = {"q" : 1}
my = {"p" : 2, "q" : 8}

5. my.q   # =8, q now is available in dictionary of my-instance.

关于python - 类属性及其初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30258788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com