Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在类中获取变量_Python_Oop_Methods - Fatal编程技术网

Python在类中获取变量

Python在类中获取变量,python,oop,methods,Python,Oop,Methods,我现在正在学习python语言,但我想用OOP风格编程。很抱歉我的问题,但在我的书和视频教程中,我找不到答案。我知道有一种更简单的方法,不用方法就可以得到一个数字。。。但我想在课堂上做;) 我想从用户那里读取一个数字 如何编写一个方法,从用户那里获取一个数字并将其放回构造函数 我试过这个,但不好:( 首先初始化实例(“为我创建一个新的示例”!) 然后您可以使用其方法: exampleNumber = ex.read() 您不需要将作为参数传递,因为它将存储在实例中。只需执行以下操作: def

我现在正在学习python语言,但我想用OOP风格编程。很抱歉我的问题,但在我的书和视频教程中,我找不到答案。我知道有一种更简单的方法,不用方法就可以得到一个数字。。。但我想在课堂上做;)

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

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

我试过这个,但不好:(


首先初始化实例(“为我创建一个新的
示例”
!)

然后您可以使用其方法:

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