Python OOP:__init __()括号中的属性与外部属性之间的差异

时间:2012-10-14 14:31:50

标签: python oop class attributes

我在这里和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 = chipself.chip = chip之间的区别是什么?
  4. __init__()中声明属性并在__init__()之外声明属性之间的区别是什么? self.pear =10

3 个答案:

答案 0 :(得分:3)

self将是Par的一个实例。 self.__dict__是一个包含self属性的字典。当你说

self.fruit = chip

创建了dict中的条目:self.__dict__将包含{'fruit':chip}

当你说

def __init__(self, chip, fig):

您声明Par必须传递两个值,chipfig。 (self实例将为您传递给__init__。)

因此,在__init__内,局部变量(非属性!)chipfig已知。

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__属性中的条目是针对LHSRHS作为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有两个属性nameattr
  • 实例demo2也有两个属性namediffAttr,第二个属性对于两个实例都不同。

答案 2 :(得分:1)

  1. 任何一个都是正确的。

  2. 在python中,您不必声明变量。 self.fruit = chip创建变量self.fruit,然后为其指定chip变量的值

  3. self.fruit = chipchip的值存储为self.fruit变量,而self.chip = chipchip的值存储在self.chip

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

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

    执行self.pear功能后,您可以像这样阅读和修改__init__self.fruitself.fig的值:

    self.pear