Python在类中获取变量

时间:2014-12-02 12:41:09

标签: python oop methods

我现在正在学习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())

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

正如其他人所建议的那样,将输入分离为独立函数是一种很好的方法,但如果你真的想在类中保留输入,你可以使用classmethod来提供一个替代构造函数: / p>

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(...)

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

答案 2 :(得分:0)

首先初始化实例(“让我成为新的example!”)

ex = example()

然后你可以使用它的方法:

exampleNumber = ex.read()

您不需要将a作为参数传递,因为它将存储在实例中。做这样的事情:

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

答案 3 :(得分:0)

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

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())

答案 4 :(得分:0)

哎呀,男孩......我甚至都不知道从哪里开始。

首先不要以OOP开头!在更多的情况下,OOP然后不被完全弄清楚。它几乎总是围绕“抽象”和“类层次结构”发展。即使“ISO”错了也没有用(ISO / IEC 2382-15)。 (参见Alan Kays关于这个问题的评论,他们创造了面向对象的术语。)

杰克迪德里奇在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

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

因此,如果您引用实例的属性,则可以在特定实例属性(self.)之前将self.number放在number中。您可以按照自己的意愿命名,但是您应该遵守约定并将其命名为selfself与其他语言中的this类似。

让我们跳到:

exampleNumber = example (read())

你创建了一个名为exampleNumber的标识符(不是变量,python没有经典变量!),并为它指定了一个example类型的新对象,并且......嗯?在哪里 read来自哪里?它不是内置的python,也不是关键字。你的意思是来自班级read的方法example?吗?你真的试着驾驶一辆尚未建造的汽车吗?最重要的是,您需要将其称为example.read("some argument here")exampleNumber.read("some bogus Argument here")

首先要做的事情:

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

    exampleNumber = example(1)

  2. 然后你可以对它进行操作:

    whatever = example.Number.read(“curius argument”)

  3. 最后让我们看一下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范例。

    我做了一些粗略的过度简化,以尽可能简短,所以请不要把它烧烤。