Python中的空类对象
我正在教一个关于面向对象编程的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
参数)