python空类对象

时间:2011-06-01 15:50:56

标签: python oop empty-class

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

class Employee:
    pass

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

john = Employee()
john.full_name = "john doe"

有趣!

我想知道是否有办法为这样的类的实例动态定义函数?类似的东西:

john.greet() = print 'hello world!'

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

4 个答案:

答案 0 :(得分:34)

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

这意味着你可以做一些整洁的动态事情,如:

class Employee: pass
def foo(self): pass
Employee.foo = foo

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

答案 1 :(得分:16)

尝试lambda

john.greet = lambda : print( 'hello world!' )

你能够做到:

john.greet()

编辑:感谢 Thomas K 注意 - 这适用于Python 3.2而不适用于Python2,其中print似乎是{{} 1}}。但这适用于statement s,没有语句(对吧?对不起,我只知道lambda(:)

答案 2 :(得分:0)

您可以使用AttrDict

>>> from attrdict import AttrDict
>>> my_object = AttrDict()
>>> my_object.my_attribute = 'blah'
>>> print my_object.my_attribute
blah
>>> 

从PyPI安装attrdict:

pip install attrdict 

它在其他情况下也很有用 - 比如当你需要对dict键进行属性访问时。

答案 3 :(得分:0)

您还可以使用"命名元组"来自collection标准模块。命名元组就像"普通"元组但元素具有名称,您可以使用"点语法"来访问元素。来自collection docs

>>> # Basic example
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(11, y=22)     # instantiate with positional or keyword arguments
>>> p[0] + p[1]             # indexable like the plain tuple (11, 22)
33
>>> x, y = p                # unpack like a regular tuple
>>> x, y
(11, 22)
>>> p.x + p.y               # fields also accessible by name
33
>>> p                       # readable __repr__ with a name=value style
Point(x=11, y=22)