dws*_*ein 5 python class function instantiation self
我知道关于这个主题已经写了很多。然而,我无法吸收其中的大部分。也许是因为我是一个完整的新手,没有任何计算机科学培训的好处。无论如何,也许如果你们中的一些大智慧在这个特定的例子中加入,你会帮助像我这样的其他初学者。
所以,我编写了以下函数,当我调用它(作为模块?)时,它工作得很好,因为它是自己的名为“funky.py”的文件:
我在终端中输入以下内容:
python classy.py
Run Code Online (Sandbox Code Playgroud)
它运行良好。
def load_deck():
suite = ('Spades', 'Hearts')
rank = ('2', '3')
full_deck = {}
i = 0
for s in suite:
for r in rank:
full_deck[i] = "%s of %s" % (r, s)
i += 1
return full_deck
print load_deck()
Run Code Online (Sandbox Code Playgroud)
但是,当我在类中放置相同的函数时,出现错误。
这是我的“classy.py”代码:
class GAME():
def load_deck():
suite = ('Spades', 'Hearts')
rank = ('2', '3')
full_deck = {}
i = 0
for s in suite:
for r in rank:
full_deck[i] = "%s of %s" % (r, s)
i += 1
return full_deck
MyGame = GAME()
print MyGame.load_deck()
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Traceback (most recent call last):
File "classy.py", line 15, in <module>
print MyGame.load_deck()
TypeError: load_deck() takes no arguments (1 given)
Run Code Online (Sandbox Code Playgroud)
因此,我将定义行更改为以下内容并且它工作正常:
def load_deck(self):
Run Code Online (Sandbox Code Playgroud)
将一个函数放在一个需要使用“self”的类中是什么意思。我知道“自我”只是一种约定。那么,为什么需要任何论证呢?从类中调用函数时,函数的行为是否有所不同?
此外,这几乎更重要,为什么我的班级没有使用init的好处?使用init会对我的班级做什么?
基本上,如果有人有时间像我 6 岁的孩子一样向我解释这一点,那会有所帮助。在此先感谢您的帮助。
在类定义中定义函数会调用一些魔法,将其转换为方法描述符。当您访问 foo.method 时,它会自动创建一个绑定方法并将对象实例作为第一个参数传递。您可以使用 @staticmethod 装饰器来避免这种情况。
__init__只是创建类时调用的一个方法来执行可选设置。__new__是实际创建对象的东西。
这里有些例子
>>> class Foo(object):
def bar(*args, **kwargs):
print args, kwargs
>>> foo = Foo()
>>> foo.bar
<bound method Foo.bar of <__main__.Foo object at 0x01C9FEB0>>
>>> Foo.bar
<unbound method Foo.bar>
>>> foo.bar()
(<__main__.Foo object at 0x01C9FEB0>,) {}
>>> Foo.bar()
Traceback (most recent call last):
File "<pyshell#29>", line 1, in <module>
Foo.bar()
TypeError: unbound method bar() must be called with Foo instance as first argument (got nothing instead)
>>> Foo.bar(foo)
(<__main__.Foo object at 0x01C9FEB0>,) {}
Run Code Online (Sandbox Code Playgroud)