Python中的空类对象

64 投票
4 回答
79968 浏览
提问于 2025-04-16 18:46

我正在教一个关于面向对象编程的Python课程,最近在复习如何解释类的时候,看到一个空的类定义:

class Employee:
    pass

接下来这个例子又为这个类的对象定义了一个名字和其他属性:

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

挺有意思的!

我在想,是否有办法为这个类的实例动态地定义一个函数呢?类似于:

john.greet() = print 'Hello, World!'

这个在我的Python解释器里不行,但有没有其他方法可以做到呢?

4 个回答

1

你还可以使用来自collection标准模块的“命名元组”。命名元组的工作方式和“普通”元组一样,但它的元素有名字,你可以通过“点语法”来访问这些元素。具体内容可以参考collection文档

>>> # 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)
20

试试用 lambda

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

这样你就可以做到:

john.greet()

编辑:感谢 Thomas K 的提醒 - 这个在 Python 3.2 上有效,但在 Python2 上不行,因为那时候 print 是一个 语句。不过这个方法对 lambda 是有效的,不需要 语句(对吧?抱歉,我只会 python3.2 (: )

51

类其实就是一个比较高级的方式,用来把对象的属性放在一个像字典一样的地方。当你创建一个类的实例时,你可以给它的属性赋值,这些值会被存储在 foo.__dict__ 里;同样地,你也可以在 foo.__dict__ 中查看你已经写过的属性。

这就意味着你可以做一些很酷的动态操作,比如:

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

同时也可以给特定的实例赋值。(编辑:添加了 self 参数)

撰写回答