我在这里和Python教程中已经阅读了很多关于Python OOP的内容。但是有些问题会让我对类属性产生误解。
示例:
class Par(object):
def __init__(self, chip, fig):
self.fruit = chip
self.fig = fig
self.pear =10
self.fruit = chip
不应该self.chip = chip
?fruit
怎么没有出现在__init__()
括号中的属性列表中,但是它被使用了? self.fruit = chip
和self.chip = chip
之间的区别是什么?__init__()
中声明属性并在__init__()
之外声明属性之间的区别是什么? self.pear =10
答案 0 :(得分:3)
self
将是Par
的一个实例。 self.__dict__
是一个包含self
属性的字典。当你说
self.fruit = chip
创建了dict中的条目:self.__dict__
将包含{'fruit':chip}
。
当你说
时def __init__(self, chip, fig):
您声明Par
必须传递两个值,chip
和fig
。 (self
实例将为您传递给__init__
。)
因此,在__init__
内,局部变量(非属性!)chip
和fig
已知。
self.fruit = chip
正在创建值为fruit
的属性 chip
。
例如,
class Par(object):
def __init__(self, chip, fig):
self.fruit = chip
self.fig = fig
self.pear = 10
# 99 is being passed in as the value of `chip`
# 'bar' is being passed in as the value of `fig`
par = Par(99,'bar')
print(par.__dict__)
产量
{'fruit': 99, 'pear': 10, 'fig': 'bar'}
请注意,要访问您通常使用的属性,例如par.fruit
而不是par.__dict__['fruit']
。我在上面显示par.__dict__
只是为了让你了解幕后发生的事情。
答案 1 :(得分:1)
“self.fruit = chip”和“self.chip =”之间的区别是什么? 芯片“?
只有一个区别。在第一种情况下,您将chip
存储在名为fruit
的属性中,而在第二种情况下,将其存储为chip
。该类的__dict__
属性中的条目是针对LHS
和RHS
作为name-value
对的。 LHS表示您用于链接到类的attribute
属性中的值的__dict__
的名称。你可以any name
那里......
如果水果没有出现在 init ()的属性列表中 括号但是使用了
出于与我上面写的相同的原因。 fruit
是一个类属性。您可以在__init__
方法中声明它,并将传递的值分配给attribute
。
在init()中声明属性有什么区别 并在_init()之外声明它,例如“self.pear = 10”
__init__
内声明的变量是类属性。它们对于为该类创建的所有实例都是通用的。而您在外部声明的属性是instance
特定的。因此,具体而言,类的每个实例都可以具有“不同的属性集”。
class Demo:
def __init__(self, name):
# This attribute is linked to every instance through self parameter,
# which contains the reference to the current instance.
self.name = name
demo1 = Demo("demo1")
demo2 = Demo("demo2")
demo1.attr = "new Attr" # Creating Attribute on the fly.
demo2.diffAttr = "diff Attr"
所以,在上面的代码中: -
demo1
有两个属性name
和attr
demo2
也有两个属性name
和diffAttr
,第二个属性对于两个实例都不同。答案 2 :(得分:1)
任何一个都是正确的。
在python中,您不必声明变量。 self.fruit = chip
创建变量self.fruit
,然后为其指定chip
变量的值
self.fruit = chip
将chip
的值存储为self.fruit
变量,而self.chip = chip
将chip
的值存储在self.chip
中
chip
和flag
不属于Par对象。它们仅用于访问调用时传递给函数的值。
self
关键字告诉解释器后面的变量是对象的成员。
在您的示例中,chip
和fig
的值将在执行函数__init__
后丢失,但值self.fruit
,self.fig
和{{只要对象离开,1}}就会保留。这意味着他们有不同的范围。
执行self.pear
功能后,您可以像这样阅读和修改__init__
,self.fruit
和self.fig
的值:
self.pear