【问题标题】:how to pass variables between functions in a class, while defining them as an object?如何在类中的函数之间传递变量,同时将它们定义为对象?
【发布时间】:2021-07-22 16:37:57
【问题描述】:
class C():
    def A(self):
        mm=[]
        kk=[]
        x="Y"
        while x=="Y":
            x=input("do you have any stuff?[Y/N]: ")
            if x=="N":
                break
            mm.append(input("enter the name of the thing: "))
            kk.append(input("Enter the value of the thing: "))
     def printing(self):
        print("="*100)
        print("stuff")
        for i in range(0,len(self.mm)):
            print(self.mm[i]," "*20,self.kk[i])
shr = C()
shr.A()
shr.printing()

代码给出一个属性错误, “C”对象没有属性“mm” 有谁知道如何解决这个错误?

【问题讨论】:

  • ...您从不在您的班级中分配属性self.mm..为什么您期望会有这样的属性?如果您希望该实例有一个属性,您必须在某处分配给self.mm...
  • @ZalakBhalani 我同意,它很丑,但它不是无效的并且要清楚,不是这个错误的来源
  • 请注意,通常最好的做法是单独获取用户输入,然后在实例化时将其传入类。
  • @juanpa.arrivillaga 我同意你的观点,但这不是一个好的做法。我并不是说这是这个错误的根源。

标签: python python-3.x function object oop


【解决方案1】:

您可以在__init__ 中创建变量。此变量称为实例变量,属于对象实例。 __init__ 方法类似于 C++ 和 Java 中的构造函数。

示例 1

class C:
    def __init__(self):
        self.mm = []
        self.kk = []
        self.x = 'Y'
        
    def A(self):
        while self.x == "Y":
            self.x=input("do you have any stuff?[Y/N]: ")
            if self.x=="N":
                break
            self.mm.append(input("enter the name of the thing: "))
            self.kk.append(input("Enter the value of the thing: "))
            
    def printing(self):
        print("="*100)
        print("stuff")
        for i in range(0,len(self.mm)):
            print(self.mm[i]," "*20,self.kk[i])

您还可以在__init__ 类之外创建变量。事实上,这些是静态类变量,因此类的所有实例都可以访问它们。它们可以通过类引用读取(例如:ClassName.varname),并且可以通过以类名开头的任何方法进行设置(Classname.varname= X

它也可以通过self.varname 读取,为所有实例生成相同的值。但是,当通过实例引用(如self.varname = X)分配值时,将仅为该实例创建一个新的self.varname,从而隐藏类变量。

示例 2:

class C:
    mm = []
    kk = []
    x = 'Y'
        
    def A(self):
        while self.x == "Y":
            self.x=input("do you have any stuff?[Y/N]: ")
            if self.x=="N":
                break
            self.mm.append(input("enter the name of the thing: "))
            self.kk.append(input("Enter the value of the thing: "))
            
    def printing(self):
        print("="*100)
        print("stuff")
        for i in range(0,len(self.mm)):
            print(self.mm[i]," "*20,self.kk[i])
        

  

【讨论】:

  • 将此称为“在__init__ 之外”具有误导性。这些是在类主体中定义的变量。 OP 实际上并没有这样做,创建 local 变量。
  • 能否请您改写介绍段?这是非常误导。设置属性和设置变量是与赋值位置无关的两件事。虽然其中一个通常__init__ 中执行一个,而另一个在“外部”执行一个,但这并不是它们影响的原因。
  • @MisterMiyagi 我已经编辑了我的提交。为之前的措辞道歉,因为我同意它们极具误导性。感谢您指出这一点。
【解决方案2】:

如果你需要类字段,你必须把它们放在__init__ 方法中。 在您的情况下,您应该这样做:

class C:
    def __init__(self):
        self.mm = []
        self.kk = []
    def A(self):
        x="Y"
        while x=="Y":
            x=input("do you have any stuff?[Y/N]: ")
            if x=="N":
                break
            self.mm.append(input("enter the name of the thing: "))
            self.kk.append(input("Enter the value of the thing: "))
     def printing(self):
        print("="*100)
        print("stuff")
        for i in range(0,len(self.mm)):
            print(self.mm[i]," "*20,self.kk[i])
shr = C()
shr.A()
shr.printing()

【讨论】:

  • 没有__init__。虽然这通常是最佳做法,但您应该清楚这不是问题的症结
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 2019-06-04
  • 1970-01-01
相关资源
最近更新 更多