пустой объект класса Python - PullRequest
46 голосов
/ 01 июня 2011

Я преподаю класс python по объектно-ориентированному программированию, и пока я разбираюсь, как объяснить классы, я увидел пустое определение класса:

class Employee:
    pass

В этом примере продолжается определение имени и других атрибутов для объекта этого класса:

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

интересно!

Мне интересно, есть ли способ динамически определять функцию для экземпляра такого класса? что-то вроде:

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

это не работает в моем интерпретаторе python, но есть ли другой способ сделать это?

Ответы [ 4 ]

34 голосов
/ 01 июня 2011

Класс - более или менее необычная оболочка для dict атрибутов объектов.Когда вы создаете экземпляр класса, вы можете назначить его атрибуты, и они будут сохранены в foo.__dict__;аналогично, вы можете искать в foo.__dict__ любые атрибуты, которые вы уже написали.

Это означает, что вы можете делать некоторые изящные динамические вещи, такие как:

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

, а также присваиватьпример.(РЕДАКТИРОВАТЬ: добавлен self параметр)

16 голосов
/ 01 июня 2011

Попробуйте с lambda:

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

Вы сможете сделать:

john.greet()

EDIT : Спасибо Thomas K за примечание - это работает на Python 3.2, а не на Python2, где print оказалось statement. Но это будет работать в течение lambda с, без заявлений (верно? Извините, я знаю только python3.2 (:)

0 голосов
/ 08 сентября 2016

Вы также можете использовать «именованные кортежи» из стандартного модуля 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)
0 голосов
/ 24 февраля 2015

Вы можете использовать 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.

...