python中的类实例化和“自我”

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 岁的孩子一样向我解释这一点,那会有所帮助。在此先感谢您的帮助。

Ant*_*ony 4

在类定义中定义函数会调用一些魔法,将其转换为方法描述符。当您访问 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)

  • @dwstein 这是一个像其他变量一样的变量。正如“x”可以引用任何数字一样,“self”可以引用类的任何实例(或者更绝对的是,此时正在运行该方法的实例)。当该方法运行时,第一个参数(`self`)会自动填充此实例。 (3认同)
  • 顺便说一句,您确实需要了解类和实例之间的区别。指向类的指针没有任何意义,因为类只是一种模式或配方(对象应该是什么样子)。self 是指向类的当前实例的指针(这是根据类定义创建的真实对象)。 (2认同)