【问题标题】:Python OOP: Difference between attributes in the __init__() bracket and those outside [closed]Python OOP:__init__() 括号中的属性与外部的属性之间的区别[关闭]
【发布时间】:2012-10-14 14:31:50
【问题描述】:

我在这里和 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

【问题讨论】:

  • 你不应该在一个 SO 问题中问多个问题
  • 括号内的变量是函数的参数,根本不是属性。提出的问题表明缺乏超越 OOP 方面的理解。应该进行更多研究并提出更具体的问题以阐明特定问题。

标签: python oop class attributes


【解决方案1】:

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__ 只是为了让您了解幕后发生的事情。

【讨论】:

  • 当一个人从一种静态类型的语言转变为一种动态的语言......有很多奇迹。感谢您的明确解释。
【解决方案2】:

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

只有一个区别。在第一种情况下,您将chip 存储在名为fruit 的属性中,而在第二种情况下,它的chip。类的__dict__ 属性中的一个条目是为LHSRHS 作为name-value 对创建的。 LHS 表示您用于链接到类的__dict__ 属性中的值的attribute 的名称。你可以有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,两个实例的第二个属性不同。

【讨论】:

    【解决方案3】:
    1. 任何一个都是正确的。

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

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

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

    self 关键字告诉解释器它后面的变量是对象的成员。 在您的示例中,chipfig 的值将在函数 __init__ 执行后丢失,但只要对象离开,self.fruitself.figself.pear 的值将保持不变.这意味着它们的作用域不同。

    __init__函数执行后,可以像这样读取和修改self.fruitself.figself.pear的值:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 2017-08-16
      • 2021-03-02
      • 2021-10-25
      • 2011-05-31
      • 2012-10-03
      相关资源
      最近更新 更多