2015-01-05 73 views
1

我不确定这个问题的好头衔是什么,所以我会解释我想要做什么。运行初始化程序类

我想有一个类,它可以在某种程度上像这样被实例化:

class Setting(int): 
    def __init__(self, value, description=None): 
    super(Setting, self).__init__(value) 
    self.description = description 

max_memory = Setting(5, description="The maximum memory we can use") 

print s + 5 # 10 
print s.description # The maximum memory we can use 

但后来,我想这对所有对象的工作,这样我就可以有一个类。这样我可以使对象的行为与底层的value对象的行为完全相同,但只是具有其他description属性。

我试图改变以上:

class Setting(object): 
    def __init__(self, value, description=None): 
    type(value).__init__(value) 
    self.description = description 

s = Setting(5) 

print s + 5 
print s.description 

但现在我得到的错误:

Traceback (most recent call last): 
    File "test.py", line 8, in <module> 
    print s + 5 
TypeError: unsupported operand type(s) for +: 'Setting' and 'int' 

,如果我看dir(self),它似乎并没有已经运行了初始化剂value

可以做到这一点吗?

我知道我可以为不同的类型创建几个不同的类,但我宁愿只有一个类而只是通用。

(是的,我意识到如果对象有一个description属性它会被覆盖,我打算使用它仅用于基元,这是首先它是一个问题的原因之一,因为我不能只是添加属性。)

+0

也许你可以使用一个'descriptions'字典,其键是原始实例,其值是描述每个实例的字符串。 – Kevin

+0

因为您没有使用传递给方法中任何位置的方法的值参数,所以可以实现'__add__'方法并相应地返回值。 – ZdaR

+0

这是您的问题的准确解释吗? '我想创建一个接受两个输入的类,一个是任何标准数值类型(int,float,long等)的数字对象,另一个是文本。创建的对象应具有作为第一个参数输入的数值类型的所有方法和行为,以及支持返回第二个输入值的属性引用'.description'。这是可能的,如果是的话,怎么样?“ – zehnpaard

回答

0

如果我理解你正确,你想要的类型/类的行为通常像他们的类型,并且还有一个'描述'字段。你如何去很奇怪 - 我相信声明

type(value).__init__(value) 

有任何作用,虽然我感到困惑,为什么Python没有抛出一个警告这一点。当然。 init init内的调用应该保留给超类。

我会做以下,并使用s.value不是s:

class Setting(object): 
    def __init__(self, value, description=None): 
    self.value = value 
    self.description = description 

s = Setting(5) 

print s.value + 5 
print s.description 
+1

这样做的问题是每次我想要使用该对象时,我必须执行's.value',这正是我想要避免的。 – will

5

这里是什么,我觉得你要完成一个验证的概念:

def Setting(value, description=None): 
    class Internal(type(value)): 
     def __new__(self, value, description=None): 
      return type(value).__new__(Internal, value) 
     def __init__(self, value, description=None): 
      super(Internal, self).__init__(value) 
      self.description = description 
    return Internal(value, description) 

s = Setting(5, description="The maximum memory we can use") 

print s+10, s.description 

v = Setting([1, 2], description="A useful list") 

print v+[3], v.description 

它发射出

15 The maximum memory we can use 
[1, 2, 3] A useful list 

其核心思想是将类包装成工厂函数 - “额外的间接程度”这应该可以帮助你达到你想要的结果。

我称之为“概念验证”,首先,因为它非常浪费内存:每次调用Setting时都会弹出一个新的类对象。工厂函数应该包含一个dict作为注册表,从type(value)到包含它的特定Internal类,即时填充它 - 一种典型的“memoization”习惯用法,尽管这里用于节省内存,而不是运行时间。

其次,我还没有证实所有特殊方法的行为根据需要在Setting -wrapped“原始类型”(所有感兴趣的“原始类型”,无论是可变的和不可改变的) - 副手好像它应该可以工作,但只有彻底的单元测试才能给你信心! - )

+0

我意识到我可以在几分钟前做到这一点,并且正在对其进行测试。谢谢。 (我甚至叫我的内部类'_internal' – will

+0

@愿意,总是很乐意提供帮助 - 如果您需要帮助的memoization成语,我可以编辑这个答案,以显示如何使用它,当然 –

+0

备忘录评论isn'对我来说这是一个问题,因为我只有30个左右的设置,我只是想把它们全部拼在一起,并且想要在任何地方添加一个'[0/1]',我想抓住合适的部分来自我认为会使事情变得丑陋的对的列表 – will