Python class attributes and their initialization
我对python很陌生,在这段时间里我在探索课程。我有一个关于类内属性和变量的问题:通过类内的
1 2 3 4 5 6 | class MyClass1: q=1 def __init__(self,p): self.p=p def AddSomething(self,x): self.q = self.q+x |
和
1 2 3 4 5 6 | class MyClass2: def __init__(self,p): self.q=1 self.p=p def AddSomething(self,x): self.q = self.q+x |
例如的输出:
1 2 3 4 5 6 7 8 | >>> my=MyClass1(2) >>> my.p 2 >>> my.q 1 >>> my.AddSomething(7) >>> my.q 8 |
不取决于是否使用
类以及它们在Python中的实例使用类似字典的数据结构来存储信息。
因此,对于每个类定义,将在存储类级信息(类变量)的位置分配一个字典。对于该特定类的每个实例,将在存储实例特定信息(实例变量)的位置分配一个单独的字典(self)。
所以现在的下一个问题是:如何执行特定名称的查找??
这个问题的答案是,如果您通过某个实例访问这些名称,那么将首先搜索特定于实例的字典,如果在那里没有找到该名称,那么将搜索类字典以查找该名称。因此,如果在两个级别上定义了相同的值,则将覆盖前一个级别。
请注意,当您编写d['key']=val(其中d是字典)时,如果尚未存在,则"key"将自动添加到字典中。否则,当前值将被覆盖。在阅读进一步的解释之前,请记住这一点。
现在让我们来看看您用来描述问题的代码:
MyCase1
1 2 3 4 5 6 | class MyClass1: q=1 def __init__(self,p): self.p=p def AddSomething(self,x): self.q = self.q+x |
1 2 3 4 | 1. my = Myclass1(2) #create new instance and add variables to it. MyClass = {"q" : 1} my = {"p" : 2} |
1 | 2. my.p # =2, p will be taken from Dictionary of my-instance. |
1 | 3. my.q # =1, q will be takn from MyClass dict. (Not present in dictionary of my-instance). |
1 2 3 4 5 6 7 8 9 10 11 | 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} |
1 | 5. my.q # =8, q now is available in dictionary of my-instance. |
类内部的
实例属性直接分配给一个类的实例,通常在
类属性可以使用类绑定(
1 2 3 4 5 6 7 8 9 10 | >>> a = MyClass1() >>> a.q 1 >>> a.q = 3 # Create an instance attribute that shadows the class attribute 3 >>> MyClass1.q 1 >>> b = MyClass1() >>> b.q # b doesn't have an instance attribute q, so access the class's 1 |
此类中
一些文档:https://docs.python.org/2/tutorial/classes.html类和实例变量