我现在正在学习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())
答案 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:
在当前命名空间中引入了classobj
或type
类型的对象(取决于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
中。您可以按照自己的意愿命名,但是您应该遵守约定并将其命名为self
。 self
与其他语言中的this
类似。
让我们跳到:
exampleNumber = example (read())
你创建了一个名为exampleNumber
的标识符(不是变量,python没有经典变量!),并为它指定了一个example
类型的新对象,并且......嗯?在哪里
read
来自哪里?它不是内置的python,也不是关键字。你的意思是来自班级read
的方法example?
吗?你真的试着驾驶一辆尚未建造的汽车吗?最重要的是,您需要将其称为example.read("some argument here")
或exampleNumber.read("some bogus Argument here")
。
首先要做的事情:
实例化并初始化您的对象:
exampleNumber = example(1)
然后你可以对它进行操作:
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范例。
我做了一些粗略的过度简化,以尽可能简短,所以请不要把它烧烤。