【问题标题】:Python getting a variable in a class [closed]Python在类中获取变量[关闭]
【发布时间】:2014-12-02 12:41:09
【问题描述】:

我现在正在学习一种 Python 语言,但我想以 OOP 风格进行编程。抱歉我的问题,但在我的书和视频教程中我找不到答案。我知道有一种更简单的方法可以在没有方法的情况下获取数字……但我想在课堂上进行;)

我想从用户那里读取一个数字。

如何编写一个从用户那里获取数字并将其放回构造函数的方法?

我试过这个,但它不是很好:(

 class example:
      def __init__(self, number):
          self.number = number

      def read(self, a):
           self.a = float(input('Give me a number) '))
           return a


 exampleNumber = example (read())

【问题讨论】:

  • 你为什么要把a传递给read
  • 我觉得你不明白上课的目的是什么,因为这里没有任何意义。

标签: python oop methods


【解决方案1】:

我会将存储您的号码与从命令行读取号码分开。我假设您的示例类还有其他要实现的目标。

def read():
    a = float(input('Give me a number: '))
    return a

class Example:
    def __init__(self,number):
        self.number = number

exampleNumber = Example(read())

print 'The number is %i' % exampleNumber.number

【讨论】:

    【解决方案2】:

    正如其他人建议的那样,将输入分离到一个独立的函数将是一个不错的方法,但如果您真的想将输入保留在类中,您可以使用 classmethod 来提供替代构造函数:

    class Example:
        def __init__(self, number):
            self.number = number
    
        @classmethod
        def from_input(cls):
            a = float(input('Give me a number: '))
            return cls(a)
    
    exampleNumber = Example.from_input()
    print("The number is %i" % exampleNumber.number)
    

    这通常被认为是为具有不同不兼容参数的类提供多个构造函数的最 Pythonic 方式。例如比较dict.fromkeys(...)

    顺便说一句,您代码中的print 表示您使用的是Python 2.x。如果是这样,您应该使用raw_input() 来读取值,或者更好地升级到 Python 3.x。

    【讨论】:

    • 我会分别给出+1:示例->示例(样式点)+1,@classmethod +1,classmethod的解释+1,from_input(使用的约定->样式点)+ 1;但遗憾的是我只允许一票;-)
    【解决方案3】:

    首先你初始化实例(“给我一个新的example!”)

    ex = example()
    

    那么就可以使用它的方法了:

    exampleNumber = ex.read()
    

    您不需要将a 作为参数传递,因为它将存储在实例中。只需执行以下操作:

    def read(self):
       self.a = float(input('Give me a number) '))
       return self.a
    

    【讨论】:

      【解决方案4】:

      这里有很多方法。 但是,原始地,阅读没有。在类之外作为`

      class Example:
          def __init__(self, number):
              self.number = number
      
      num = float(input())
      exam = Example(num)
      

      并且您想在类中定义 get、edit 等方法

      或者也许不是在构造函数中传递数字,您可以在构造函数中立即调用 input(),如下所示:

      def __init__(self):
          self.number = float(input())
      

      【讨论】:

        【解决方案5】:

        哎呀,男孩……我什至不知道从哪里开始。

        首先不要从 OOP 开始!在更多情况下,OOP 并不完全是错误的。它几乎总是围绕“抽象”和“类层次结构”发展。即使是“ISO”也弄错了(ISO/IEC 2382-15)也无济于事。 (参见 Alan Kays 关于这个问题的评论,他创造了面向对象这个术语。)

        Jack Diederich 在PyCon US 2012 发表了关于 OOP 和课堂歇斯底里的精彩演讲。

        但是为了你的问题,让我们剖析你得到了什么:

        class example:
        

        在当前命名空间中引入 classobjtype(取决于 Python 版本)类型的对象。而example 已经是它自己的一个对象,而不是经典“蓝图”意义上的“纯”类,而更像是一个原型。您可以对类进行操作,而无需从中实例化对象。

        下一步:

        def __init__(self, number):
            self.number = number
        

        __init__ 通常被称为构造函数,因为它(几乎)是最接近它的东西,但它仍然不是“经典”意义上的构造函数。它不会“创建”对象/实例,而只是对其进行初始化。为此,该方法需要知道它应该使用的许多example 实例中的哪个 实例。因此,适用于实例的每个方法都有一个隐式的第一个参数,按照约定称为self,它包含对您要使用的实例的引用。如果您调用 someobj.some_method("some argument"),它会被隐式翻译为:

        class.some_method(someobj, "some argument")  # someobj -> self
        

        这有点过于简单化了,但它解释了类声明中定义的方法签名。

        因此,如果您引用实例的属性,您可以通过在特定实例属性 (number) 之前放置 self. 中的 self.number 来实现。您可以随意命名,但应遵守约定并将其命名为selfself 在其他语言中类似于 this

        让我们跳到:

        exampleNumber = example (read())
        

        您创建了一个名为exampleNumber 的标识符(不是变量,python 没有经典变量!)并为其分配一个example 类型的新对象,然后......嗯?在哪里做 read来自哪里?它不是 python 内置的,也不是关键字。您是指example? 类中的方法read 吗?您是否真的尝试驾驶尚未建造的汽车?最重要的是,您需要将其命名为 example.read("some argument here")exampleNumber.read("some bogus Argument here")

        第一件事:

        1. 实例化并初始化您的对象:

          exampleNumber = example(1)

        2. 那么你就可以对其进行操作了:

          whatever = example.Number.read("curius argument")

        最后让我们回顾一下 read 方法:

          def read(self, a):
               self.a = float(input('Give me a number) '))
               return a
        

        您可能想要使用raw_input 而不是input。您可能还想返回对象属性a:self.a,而不是参数值a

        我希望我能对你有所帮助,但我强烈建议放弃整个 OOP 概念并从结构化编程开始。你仍然会使用对象,因为在 python 中一切都是对象,甚至是类和类型。稍后您可能会开始将对象用作“小机器”,就像 Alan Kay 曾经所说的那样,然后您就掌握了 OOP 范式。

        我做了一些粗略的过度简化以使其尽可能简短,所以请不要因为它而折磨我。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-27
          • 1970-01-01
          • 2023-03-03
          • 1970-01-01
          • 1970-01-01
          • 2022-01-20
          • 1970-01-01
          • 2012-08-04
          相关资源
          最近更新 更多