2011-06-01 99 views
2

我已经写了类装饰器猴片的一类覆盖INIT和添加的方法仍然存在()。到目前为止一切正常。类装饰用类方法

现在我需要一个类方法(静态方法)添加到装饰类。我有什么在我的代码更改为使STATICMETHOD()装饰类的静态方法?

这是我的代码:

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 

class Persistent (object): 
    def __init__ (self, table = None, rmap = None): 
     self.table = table 
     self.rmap = rmap 

    def __call__ (self, cls): 
     cls.table = self.table 
     cls.rmap = self.rmap 
     oinit = cls.__init__ 
     def finit (self, *args, **kwargs): 
      print "wrapped ctor" 
      oinit (self, *args, **kwargs) 
     def persist (self): 
      print "insert into %s" % self.table 
      pairs = [] 
      for k, v in self.rmap.items(): pairs.append ((v, getattr (self, k))) 
      print "(%s)" % ", ".join (zip (*pairs) [0]) 
      print "values (%s)" % ", ".join (zip (*pairs) [1]) 
     def staticMethod(): print "I am static" 
     cls.staticMethod = staticMethod 
     cls.__init__ = finit 
     cls.persist = persist 
     return cls 

@Persistent (table = "tblPerson", rmap = {"name": "colname", "age": "colage"}) 
class Test (object): 
    def __init__ (self, name, age): 
     self.name = name 
     self.age = age 

a = Test ('John Doe', '23') 
a.persist() 
Test.staticMethod() 

,输出是:

wrapped ctor 
insert into tblPerson 
(colage, colname) 
values (23, John Doe) 
Traceback (most recent call last): 
    File "./w2.py", line 39, in <module> 
    Test.staticMethod() 
TypeError: unbound method staticMethod() must be called with Test instance as first argument (got nothing instead) 

回答

3
@staticmethod 
    def staticMethod(): print "I am static" 

def staticMethod(): print "I am static" 
    cls.staticMethod = staticmethod(staticMethod) 
+0

谢谢。有时它很简单。 – Hyperboreus 2011-06-01 02:50:00

+0

有时Python有奇怪的语法。 – GWW 2011-06-01 02:50:51

1

使用@staticmethod装饰。

@staticmethod 
def staticMethod() : ...