python空类对象

Ram*_*amy 48 python oop empty-class

我正在教一个关于面向对象编程的python类,当我正在研究如何解释类​​时,我看到了一个空的类定义:

class Employee:
    pass
Run Code Online (Sandbox Code Playgroud)

然后,该示例继续为此类的对象定义名称和其他属性:

john = Employee()
john.full_name = "john doe"
Run Code Online (Sandbox Code Playgroud)

有趣!

我想知道是否有一种方法可以为这样的类的实例动态定义函数?就像是:

john.greet() = print 'hello world!'
Run Code Online (Sandbox Code Playgroud)

这在我的python解释器中不起作用但是有另一种方法吗?

Kat*_*iel 36

dict对于对象的属性,类或多或少是一个花哨的包装器.实例化一个类时,可以为其分配属性,这些属性将存储在foo.__dict__; 同样,您可以查找foo.__dict__已编写的任何属性.

这意味着你可以做一些动态的东西,比如:

class Employee: pass
def foo(self): pass
Employee.foo = foo
Run Code Online (Sandbox Code Playgroud)

以及分配给特定实例.(编辑:添加self参数)

  • 你的例子不会按预期工作:`john.foo()`会引发一个`TypeError`,因为没有`self`参数`.将函数放在类上将其转换为方法,因此需要使用"self".另一方面,如果将一个函数分配给一个实例,它仍然是一个函数,并且无法访问实例"self",这通常没用. (7认同)

Kir*_*rov 16

试试lambda:

john.greet = lambda : print( 'hello world!' )
Run Code Online (Sandbox Code Playgroud)

你能做到的:

john.greet()
Run Code Online (Sandbox Code Playgroud)

编辑:感谢托马斯K的笔记 - 这适用于Python 3.2Python2,而不是Python2,print似乎是statement.但这对lambdas而言是有效的,没有陈述(对吧?对不起,我只知道python3.2(:)

  • 这实际上不起作用:lambdas 不能包含语句。 (2认同)
  • 由于OP想要动态定义一个函数,或许'print`示例不是最好的.+1 (2认同)