-3

我在这里和 Python 教程中阅读了很多关于 Python OOP 的内容。但是有些问题在类属性上困扰着我。

例子:

class Par(object):
    def __init__(self, chip, fig):
        self.fruit = chip
        self.fig = fig
        self.pear =10
  1. self.fruit = chip应该self.chip = chip吗?
  2. 怎么fruit没有出现在__init__()括号中的属性列表中却被使用了?
  3. self.fruit = chip和 和有什么不一样self.chip = chip
  4. __init__()在中声明属性和在外部声明属性有什么区别,__init__()例如self.pear =10
4

3 回答 3

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__局部变量(不是属性!)chipfig是已知的。

self.fruit = chip正在创建一个具有 value的属性fruitchip


例如,

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__在上面展示只是为了给你一个幕后发生的事情的图片。

于 2012-10-14T14:38:35.157 回答
1

“self.fruit = chip”和“self.chip = chip”有什么区别?

只有一个区别。在第一种情况下,您正在存储chip名为 的 in 属性fruit,而在第二种情况下,它的chip. __dict__类的属性中的条目是为LHSRHS作为name-value对。LHS 表示attribute您用于链接到__dict__类属性中的值的名称。你可以在any name那里..

为什么fruit没有出现在init ()括号内的属性列表中却被使用了

原因和我上面写的一样。fruit是一个类属性。您在__init__方法中声明它,并将传递的值分配给 that 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,两个实例的第二个属性是不同的。
于 2012-10-14T14:35:04.240 回答
1
  1. 任何一个都是正确的。

  2. 在 python 中,您不必声明变量。self.fruit = chip创建变量,然后将变量self.fruit的值分配给它chip

  3. self.fruit = chip存储的值chipself.fruit变量,而self.chip = chip存储的值chipself.chip

  4. chip并且flag不属于 Par 对象。它们仅用于访问在调用函数时传递给函数的值。

关键字告诉解释器后面的self变量是对象的成员。chip在您的示例中,和的值fig将在函数__init__执行后丢失,但只要对象离开self.fruitself.fig和的值就会保留。self.pear这意味着它们具有不同的范围。

__init__函数执行后,您可以读取和修改 的值self.fruit,如下所示:self.figself.pear

par = Par(oneChip, oneFig)
print par.fruit
print par.fig
par.pear = 20
print par.pear
于 2012-10-14T14:37:28.297 回答