Python在类中获取变量
我现在正在学习python语言,但我想用OOP风格编程。很抱歉我的问题,但在我的书和视频教程中,我找不到答案。我知道有一种更简单的方法,不用方法就可以得到一个数字。。。但我想在课堂上做;) 我想从用户那里读取一个数字 如何编写一个方法,从用户那里获取一个数字并将其放回构造函数 我试过这个,但不好:(Python在类中获取变量,python,oop,methods,Python,Oop,Methods,我现在正在学习python语言,但我想用OOP风格编程。很抱歉我的问题,但在我的书和视频教程中,我找不到答案。我知道有一种更简单的方法,不用方法就可以得到一个数字。。。但我想在课堂上做;) 我想从用户那里读取一个数字 如何编写一个方法,从用户那里获取一个数字并将其放回构造函数 我试过这个,但不好:( 首先初始化实例(“为我创建一个新的示例”!) 然后您可以使用其方法: exampleNumber = ex.read() 您不需要将作为参数传递,因为它将存储在实例中。只需执行以下操作: def
首先初始化实例(“为我创建一个新的
示例”
!)
然后您可以使用其方法:
exampleNumber = ex.read()
您不需要将作为参数传递,因为它将存储在实例中。只需执行以下操作:
def read(self):
self.a = float(input('Give me a number) '))
return self.a
我将把存储数字与从命令行读取数字分开,我假设您还需要通过示例类实现其他功能
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
这里有很多方法。
但是,最基本的是,在课堂外把数字读为`
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())
正如其他人所建议的那样,将输入分离到独立函数将是一个很好的方法,但是如果您真的希望将输入保留在类中,则可以使用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)
这通常被认为是为具有不同不兼容参数的类提供多个构造函数的最具python风格的方法。例如,比较dict.fromkeys(…)
顺便说一句,你代码中的print
意味着你正在使用Python 2.x。如果是这样,你应该使用raw\u input()
读取值,或者最好升级到Python 3.x。天啊,孩子……我甚至不知道从哪里开始
首先,不要从OOP开始!OOP在很多情况下是不完全错误的。它几乎总是围绕“抽象”和“类层次结构”发展。即使是“ISO”也错了(ISO/IEC 2382-15)。(参见艾伦·凯关于这个问题的评论,他创造了面向对象这个术语。)
杰克·迪德里奇在会上就OOP和课堂歇斯底里进行了精彩的演讲
但为了回答你的问题,让我们分析一下你得到了什么:
class example:
在当前命名空间中引入类型为classobj
或type
(取决于Python版本)的对象。并且示例
已经是它自己的对象,而不是经典“蓝图”中的“纯”类有意义,但更像一个原型。你可以在类上操作,而不需要从类中实例化对象
下一步:
\uuuu init\uuuu
通常被称为构造函数,因为它(几乎)是最接近它的东西,但它仍然不是“经典”意义上的构造函数。它不“创建”对象/实例,但只是对其进行初始化。为此,该方法需要知道它应该使用的许多示例实例中的哪个实例。因此,每个在实例上工作的方法都会得到一个隐式的第一个参数,按约定称为self
,该参数保存对实例的引用,该引用如果调用someobj.someu方法(“某个参数”)
它会隐式转换为如下内容:
class.some_method(someobj, "some argument") # someobj -> self
这有点过于简单,但它解释了类声明中定义的方法签名
因此,如果引用实例的属性,可以通过在特定实例属性(number
)之前放置一个self.
,如self.number
中所示。您可以随意命名它,但您应该遵循惯例,将它命名为self
,self
与其他语言中的类似
让我们跳到:
exampleNumber = example (read())
您创建了一个名为exampleNumber
的标识符(不是变量,python没有经典变量!),并为其分配了一个类型为example
的新对象,然后
read
来自何方?它既不是python内置的,也不是关键字。你是指类示例中的方法read
?
?你真的尝试驾驶一辆尚未建造的汽车吗?除此之外,你还需要称之为示例。read(“此处的某个参数”)
或exampleNumber.read(“这里有一些虚假的论点”)
第一件事:
实例化并初始化对象:
示例编号=示例(1)
然后您可以对其进行操作:
whatever=example.Number.read(“curius参数”)
最后让我们回顾一下读取方法:
def read(self, a):
self.a = float(input('Give me a number) '))
return a
您可能希望使用raw\u input
而不是input
。您可能还希望返回对象属性a:self.a
,而不是参数值a
我希望能对您有所帮助,但我强烈建议您放弃整个OOP概念,从结构化编程开始。您仍然会使用对象,因为在python中,所有东西都是对象,甚至是类和类型。稍后,您可能会开始将对象作为“小机器”使用“正如艾伦·凯(Alan Kay)曾经给他们打过一次电话,然后你就得到了OOP范例
我做了一些粗俗的简化,使它尽可能简短,所以请不要再问我了。为什么你要把a
传递给read
?我觉得你不明白一个类的目的是什么,因为这里没有任何意义。我会分别给出+1:example->example(样式点)+1,@classmethod+1,classmethod+1的解释,来自_input
(使用约定->样式点)+1;但遗憾的是,我只允许一票;-)
class.some_method(someobj, "some argument") # someobj -> self
exampleNumber = example (read())
def read(self, a):
self.a = float(input('Give me a number) '))
return a