蟒蛇空类对象
我教的面向对象编程和我在如何解释类刷牙蟒蛇上课,我看到了一个空的类定义:蟒蛇空类对象
class Employee:
pass
的例子然后继续定义该类别的对象的名称和其他属性:
john = Employee()
john.full_name = "john doe"
有趣!
我想知道是否有办法为这样的类动态定义一个函数?像这样:
john.greet() = print 'hello world!'
这不适用于我的python解释器,但是有没有另一种方法呢?
类是或多或少的属性对象dict
看中包装当你实例化一个类。您可以分配给它的属性,以及那些将被存储在foo.__dict__
;同样,你可以看看在foo.__dict__
你已经写好的任何属性
这意味着你可以做一些巧妙的动态的东西,如:
class Employee: pass
def foo(self): pass
Employee.foo = foo
。
以及分配给特定的实例。 (编辑:添加self
参数)
你的例子不会按预期工作:'john.foo()'会引发一个'TypeError',因为没有'self'参数'。把一个函数放到一个类中会变成一个方法,所以它需要一个'self'。另一方面,如果你给一个实例分配一个函数,它仍然是一个函数,并且不能访问实例'self',这通常是无用的。 – 2011-06-01 16:15:24
@Jochen:你当然是对的。 TA!对于OP来说:如果你明白出了什么问题,为什么会修复它,这可能会有所帮助! – katrielalex 2011-06-01 16:36:31
@Jochen,谢谢你为此添加了一些颜色。如果被定义的函数只是对象特定的(我认为),访问“自我”有多重要/有用。换句话说,这个函数并没有为Employee类型的所有对象定义(除非你使用@ katrielalex的例子并且使用ClassName来定义它),但是仅限于类的实例(就像我在OP中的“john”例子中那样) – Ramy 2011-06-01 16:41:04
尝试用lambda
:
john.greet = lambda : print('hello world!')
的,你就可以做到:
john.greet()
编辑:谢谢托马斯ķ的注意 - 这个工程上Python 3.2
而不是Python2,其中print
看起来是statement
。但是,这会为lambda
的工作,没有声明(右对不起,我只知道python3.2
(?)
这实际上并不起作用:lambda表达式不能包含语句。 – katrielalex 2011-06-01 15:58:21
@katrielalex - 在我的python 3.2上完美工作(当然,在'print'中添加了括号)。什么说法? – 2011-06-01 16:00:00
在PRE python 3.x中不起作用 – Ramy 2011-06-01 16:05:30
你可以使用AttrDict
>>> from attrdict import AttrDict
>>> my_object = AttrDict()
>>> my_object.my_attribute = 'blah'
>>> print my_object.my_attribute
blah
>>>
一封来自PyPI安装attrdict:
pip install attrdict
这是在其他情况下太有用 - 当你需要的属性访问字典键,如。
您也可以使用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)
可能吗?是。一个好主意?很少(当然,在一些元编程之外)。 – delnan 2011-06-01 16:43:54
我见过的最短的空类定义来自http://www.gossamer-threads.com/lists/python/python/832915#832915:Employee = type('Employee',(),{})'然后'john = Employee()'等 – eudoxos 2015-06-03 09:18:50