艰苦学习Python:练习40 - 课堂定义中的“对象”和“自我”是什么?

时间:2015-05-15 06:09:18

标签: python class python-2.7

以下是来自Learn Python The Hard Way的一些代码 练习40:模块,类和对象 我似乎无法弄清楚为什么MyStuff类(对象)有一个参数。 将对象放在括号中的原因是什么?

class MyStuff(object):

    def __init__(self):
        self.tangerine = "And now a thousand years between"

    def apple(self):
        print "I AM CLASSY APPLES!"

我已经查看了StackOverflow上的一些文章,但未能理解新对象和旧类对象。 有人可以在课程定义中解释object的含义吗? 如果我在申报课程时将括号留空,会发生什么?

此外,代码中的2个函数还有一个(self)参数 在书中它说“self”是在用类实例化对象时创建的空对象python 但为什么在实际使用它之前说明论点呢?

我一直在学习编程2周,所以如果问题太肤浅我会道歉,谢谢你的时间〜

1 个答案:

答案 0 :(得分:2)

根据你的评论,我看到你正在使用Python 2.在Python 2.2中,他们介绍了" New-style"课程,但保持"经典"出于向后兼容性原因的类。在Python 3.0或更新版本中,经典类已经消失 - 每个类都是一个新式类(无论语法如何)。

对于python 2.2-2.7,从语法上讲,一个新式的类是通过object明确的子类声明的(除非它有不同的父类):

class MyStuffNew(object):
    a=1

虽然省略object引用会创建一个经典类:

class MyStuffClassic():
    a=1

从功能上讲,它们的工作方式几乎相同,但在内置语言定义中它们之间存在一些差异。例如,新式类引入了内置类方法__mro()__(方法解析顺序),解释器使用该方法来确定您要调用的方法(在类继承层次结构中)。在旧式类中缺少这种内置方法(并且方法解析顺序不同,这可能导致一些意外行为)。有关New-style vs Classic类的更多信息,请阅读this Python Wiki page

如上所述,在Python3或更高版本中,使用的语法并不重要;所有课程都是新式的。但是,许多程序员将使用class MyClass(object):语法来维护与Python2.7的代码兼容性。 - 请参阅this answer

在任何版本的Python语言中,class MyChildClass(ParentClass):定义了一个继承关系 - MyChildClassParentClass的子项,并将继承其所有方法和字段。

self是Python知道这是一个成员方法而不是你的类的静态函数的方式。您只能使用self.fieldself.myMethod(var1,var2)等来访问班级中的成员字段和方法。

当您从代码中的其他位置实际调用这些函数时,您不会将值传递给self - 它是您正在使用的变量。例如:

stuff = MyStuff()
stuff.apple()
# outputs "I AM CLASSY APPLES!"
print stuff.tangerine 
# outputs "And now a thousand years between"
stuff.tangerine = "Something else."
print stuff.tangerine
# outputs "Something else."
stuff2 = MyStuff()
print stuff2.tangerine
# outputs "And now a thousand years between"

如果您未在方法定义中包含self,则调用mystuff.apple()将导致运行时错误,因为它隐含地与调用MyStuff.apple(mystuff)相同 - 将MyStuff类的实例传递给apple函数。