Пустой объект класса python
Я преподаю класс python по объектно-ориентированному программированию, и когда я разбираюсь в том, как объяснить классы, я увидел пустое определение класса:
class Employee:
pass
Затем далее приводится пример определения имени и других атрибутов для объекта этого класса:
john = Employee()
john.full_name = "john doe"
интересно!
Мне интересно, есть ли способ динамически определить функцию для такого класса? что-то вроде:
john.greet() = print 'hello world!'
это не работает в моем интерпретаторе python, но есть ли другой способ сделать это?
Ответы
Ответ 1
Класс является более или менее причудливой оболочкой для атрибутов dict
для объектов. Когда вы создаете экземпляр класса, вы можете назначить его атрибуты, и они будут сохранены в foo.__dict__
; Аналогично, вы можете просмотреть foo.__dict__
для любых атрибутов, которые вы уже написали.
Это означает, что вы можете делать некоторые аккуратные динамические вещи, например:
class Employee: pass
def foo(self): pass
Employee.foo = foo
а также присвоение конкретному экземпляру. (EDIT: добавлен параметр self
)
Ответ 2
Попробуйте с lambda
:
john.greet = lambda : print( 'hello world!' )
Вы сможете:
john.greet()
РЕДАКТИРОВАТЬ: спасибо Томасу К. за примечание - это работает на Python 3.2
, а не на Python2, где print
оказалось statement
. Но это будет работать для lambda
s без инструкций (правда? Извините, я знаю только python3.2
(:)
Ответ 3
Вы можете использовать AttrDict
>>> from attrdict import AttrDict
>>> my_object = AttrDict()
>>> my_object.my_attribute = 'blah'
>>> print my_object.my_attribute
blah
>>>
Установить attrdict из PyPI:
pip install attrdict
Это полезно и в других ситуациях - например, когда вам нужен доступ к атрибутам dict.
Ответ 4
Вы также можете использовать "именованные кортежи" из стандартного модуля 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)