【问题标题】:OOP: Init method questionsOOP:初始化方法问题
【发布时间】:2022-01-10 01:52:28
【问题描述】:

我对下面的代码有两个问题。

  1. self.a=self.test1()a=self.test1() 有什么区别?一个是类字段,一个是对象字段?
  2. 为什么我不能定义result = self.a+self.b?如何纠正?
class Test():
    def __init__(self):
        self.a=self.test1()
        a=self.test1()
        self.b=Test.test2()
    
    result = self.a+self.b    
    def test1(self):
        a=100
        return a
    @classmethod
    def test2(cls):
        b=200
        return b

    @staticmethod
    def test3():
        print("Testing3 is calling ")
        c=500
        return c

【问题讨论】:

  • 如果test2test3与您的问题无关,则应将其删除。

标签: python python-3.x class oop


【解决方案1】:

self.a = self.test1() 创建一个名为 a 的实例属性。该属性将可以在您引用该对象的任何位置从该对象访问。

a = self.test1() 定义了一个名为a 的局部变量。一旦__init__ 返回,它将超出范围。

result = self.a + self.b 不起作用,因为它位于未定义 self 的上下文中。 self 只是实例方法的第一个参数的(常规)名称。它没有在class 语句本身的命名空间中定义。

【讨论】:

  • ···class Test(): def __init__(self): self.a=self.test1() b=Test.test2() result = b
  • 当然,但是当__init__ 返回时,result 将超出范围,因此设置一个以后不会在同一函数中使用的局部变量没有什么意义。
【解决方案2】:

self.a 是此类中的一个属性。它将在Test() 类中的所有函数中保持可访问性。但是,a = self.test1() 会在 __init__(self) 完成后消失,因为 a__init__(self) 的本地对象。

对于result = self.a + self.b,我假设您希望在定义self.aself.b 之后计算一个名为result 的变量?在那个缩进级别通常不允许这样的语句(我可能是错的),通常在这里发生类属性的声明。

【讨论】:

  • class 语句可以在其主体中包含任意代码;它通常不会。赋值很常见:这只是定义了一个名为result 的类属性(或者,如果右侧没有在未定义的名称self 上提出NameError)。
  • chepner:有道理,谢谢你的澄清
  • class Test(): def __init__(self): self.a=self.test1() global b b=Test.test2() result = b
  • 如果我声明了一个全局变量b,我以后可以访问吗?
  • 你绝对可以。我假设bclass Test() 之外?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 2020-12-25
相关资源
最近更新 更多