哎呀,男孩……我什至不知道从哪里开始。
首先不要从 OOP 开始!在更多情况下,OOP 并不完全是错误的。它几乎总是围绕“抽象”和“类层次结构”发展。即使是“ISO”也弄错了(ISO/IEC 2382-15)也无济于事。 (参见 Alan Kays 关于这个问题的评论,他创造了面向对象这个术语。)
Jack Diederich 在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
这有点过于简单化了,但它解释了类声明中定义的方法签名。
因此,如果您引用实例的属性,您可以通过在特定实例属性 (number) 之前放置 self. 中的 self.number 来实现。您可以随意命名,但应遵守约定并将其命名为self。 self 在其他语言中类似于 this。
让我们跳到:
exampleNumber = example (read())
您创建了一个名为exampleNumber 的标识符(不是变量,python 没有经典变量!)并为其分配一个example 类型的新对象,然后......嗯?在哪里做
read来自哪里?它不是 python 内置的,也不是关键字。您是指example? 类中的方法read 吗?您是否真的尝试驾驶尚未建造的汽车?最重要的是,您需要将其命名为 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 范式。
我做了一些粗略的过度简化以使其尽可能简短,所以请不要因为它而折磨我。