2012-10-14 61 views
-3
之间的差异

我一直在阅读很多关于Python OOP的内容和Python教程。但有些问题会让我对班级属性产生误解。Python OOP:__init __()括号中的属性和

例子:

class Par(object): 
    def __init__(self, chip, fig): 
     self.fruit = chip 
     self.fig = fig 
     self.pear =10 
  1. 不宜self.fruit = chipself.chip = chip
  2. fruit怎么没有出现在__init__()括号内的属性列表中,但它被使用了?
  3. self.fruit = chipself.chip = chip有什么区别?
  4. __init__()中声明一个属性并在__init__()之外声明它有什么区别,例如: self.pear =10
+0

这个例子来自哪里? –

+0

你不应该在单个SO问题中提出多个问题 – Achim

+2

圆括号中的变量是函数的参数,而不是属性。提出的问题表明缺乏超越面向对象方面的理解。应该做更多的研究,并要求更具体的问题来阐明特定问题。 –

回答

3

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

self.fruit = chip 

创建在字典中的条目: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__,以便为您提供背后情况的图片。

+0

当一个人从一个静态类型的语言变成一个动态类型的语言......有许多奇观。感谢您的明确解释。 –

1

是什么 “self.fruit =芯片” 和 “self.chip = 芯片” 之间的区别?

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

为什么水果的属性列表中不会出现在初始化()括号 但它是用来

出于同样的原因,因为我上面写的。 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中,第二个属性对于两个实例都不同。
1
  1. 其中之一是正确的。

  2. 在Python中,你不必声明变量。 self.fruit = chip创建变量self.fruit,然后将其assignes给它的chip可变

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

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

self关键字告诉解释器它后面的变量是对象的成员。 在你的例子中,chipfig的值在执行函数__init__后将会丢失,但self.fruit,self.figself.pear的值将一直保留,直到对象离开。这意味着他们有一个不同的范围。执行__init__功能

后,您可以读取和修改的self.fruitself.figself.pear这样的价值观:

par = Par(oneChip, oneFig) 
print par.fruit 
print par.fig 
par.pear = 20 
print par.pear