以下是来自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周,所以如果问题太肤浅我会道歉,谢谢你的时间〜
答案 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):
定义了一个继承关系 - MyChildClass
是ParentClass
的子项,并将继承其所有方法和字段。
self
是Python知道这是一个成员方法而不是你的类的静态函数的方式。您只能使用self.field
和self.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函数。