2014-01-23 89 views
2

的Python似乎不允許您屬性分配給「對象」的內部最高級別:Python不能設置內置/擴展型「對象」的屬性

object.lst=lambda o:list(o) 

或者

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

全部生成錯誤消息。 背後的任何設計理由?老實說,這很奇怪,因爲一切都是一個對象,你可以根據需要定義func(obj),所以如果func不是約束參數類型,爲什麼方法禁止添加呢? obj.func()如果將func作爲屬性指定給object,那麼它正是func(obj)。由於一切都是一個對象,所以對象的一個​​屬性幾乎是按照定義的全局函數。

無論如何走動?

基本上,如果你有能力添加一些功能的內置類型,你可以做管道風格編程:obj.list().len().range(),我認爲這種類型的程序的可讀性非常明確,沒有任何非pythonic。

+0

參見:http://stackoverflow.com/questions/6738987/extension-method-for-python-built-in-types – senshin

+0

@senshin,這個加載項確實將屬性賦值給內部對象,如果你把它放在答案中II可以接受它作爲答案。 – NathaneilCapital

+0

請隨時自己回答這個問題 - 你知道你在找什麼比我更好。 – senshin

回答

5

我不確定此刻的實際「設計」推理,儘管存在 - 但事實是該對象,因爲其他一些內置類是使用本機代碼編寫的(稱爲「內置「) -

由於這些內置類的性質(它們的代碼通常是C),它們本身沒有__dict__屬性,因此禁止任意參數設置。

函數對象在沿着2.x開發週期某處實現__dict__屬性,因此它們可以保存任意屬性。

的路要走,如果你需要的東西,可以作爲一個「對象」,但有任意屬性是子類的對象,並且有添加屬性:

class MyObj(object): pass 

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

是的,那麼它的返回是一個列表,一個內置類型,你不能添加方法(除非你重新返回到一個子類,這意味着你有許多許多代碼鍵入)。 – NathaneilCapital