在python中,self是否需要任何相同类型的对象?

时间:2016-08-26 19:05:55

标签: python class

我正在阅读9.3.2。来自python docs的类对象我希望有人可以清理以下内容:

两个场景如何回归' hello world'?我有点理解的第一个例子(至少我相信我这样做),因为自我引用了对象本身' MyClass'我想通过' m'在第二个实例中自我也是这样做的?功能是否自我'只需要参考一个' MyClass'对象

>>> class MyClass:
...     """A simple example class"""
...     i = 12345
...     def f(self):
...         return 'hello world'
...
>>> MyClass.f(MyClass)
'hello world'
>>> m = MyClass()
>>> MyClass.f(m)
'hello world'

2 个答案:

答案 0 :(得分:3)

Python是“duck-typed”,意味着 类型self无关紧要,只要它提供正确的接口即可。在这里,self未在函数体中使用,因此您可以将任何绝对传递给MyClass.f,这样就可以了。

>>> MyClass.f(None)
'hello world'
>>> MyClass.f(9)
'hello world'
>>> MyClass.f("foo")
'hello world'

答案 1 :(得分:0)

MyClass.f('what the...')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-cca57c03fecc> in <module>()
----> 1 MyClass.f('what the...')

TypeError: unbound method f() must be called with MyClass instance as first argument (got str instance instead)

mc = MyClass()

mc.f('what?')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-bcd3830312d3> in <module>()
----> 1 mc.f('what?')

TypeError: f() takes exactly 1 argument (2 given)

在第一个实例中,该函数需要MyClass的实例作为第一个参数。在第二个中,实例被隐式传递。因此,字符串参数What?是函数的第二个参数,这是意外的。

你可能想要什么:

class MyClass:
    @staticmethod
    def f():
        print('hello world')

>>> MyClass.f()
hello world

mc = MyClass()
>>> mc.f()
hello world