2014-01-23 2 views
2

Python кажется запрещает вам назначить атрибут внутреннего самого высокого уровня «объекта»:питон не может установить атрибуты встроенного/расширения типа «объект»

object.lst=lambda o:list(o) 

Или

func=lambda o:list(o) 
setattr(object,'lst',func) 

Все генерируют сообщения об ошибках. Любые причины конструкции? Честно говоря, это странно, поскольку все является объектом, и вы можете определить func(obj), как хотите, так что если func не ограничивает тип аргумента, почему метод метода запрещен для добавления? obj.func() - это точно func (obj), если вы назначаете func как атрибут object. Поскольку все является объектом, атрибут объекта является глобальной функцией почти по определению.

В любом случае, чтобы прогуляться?

В принципе, если у вас есть возможность добавить некоторые функции к встроенным типам, вы можете выполнить программирование в стиле трубопровода: obj.list().len().range(), и я думаю, что читаемость этого типа программы очень ясна и ничего не пифонического.

+0

Смотрите также: http://stackoverflow.com/questions/6738987/extension-method-for-python-built-in-types – senshin

+0

@senshin, эта надстройка точно назначает атрибут внутреннему объекту, если вы положите его в ответ, то я могу принять его в качестве ответа. – NathaneilCapital

+0

Не стесняйтесь отвечать на вопрос самостоятельно - вы знаете, что ищете лучше, чем я. – senshin

ответ

5

В настоящий момент я не уверен в фактической «конструкторской» аргументации, хотя есть, но факт в том, что этот объект, поскольку некоторые другие встроенные классы записаны в собственном коде (называемом «встроенным» ") -

Из-за природы эти встроенные классы сделаны (их код обычно находится в C), они не имеют атрибута __dict__ и, таким образом, запрещают произвольные установки параметров.

Функциональные объекты имели атрибут __dict__, реализованный где-то по циклу разработки 2.x, поэтому они могут содержать произвольные атрибуты.

путь, если вам нужно что-то, что работает как «объект», но иметь произвольные атрибуты является подкласс объекта, а также добавить свои атрибуты там:

class MyObj(object): pass 

MyObj.lst = lambda o: list(o) 
+0

Да, тогда его возврат - это список, тип встроенного типа, вы не можете добавить к нему метод (если вы не переопределите возврат в подкласс снова, это означает, что вам нужно ввести много кода). – NathaneilCapital

Смежные вопросы