元类将类名作为参数传递
Metaclass pass classname as parameter
我有元class喜欢:
class Metaclass(type):
def __new__(self, name, bases, attrs):
for k, v in attrs.iteritems():
if isinstance(v, types.FunctionType):
attrs[k] = self.decorator(v)
return super(MetaClass, self).__new__(self, name, bases, attrs)
@classmethod
def decorator(cls, func):
def wrapper(*args, **kwargs):
print(func.__name__)
但我无法得到 func.__class__.__name__
它打印 metaclass。我想获取 func.__name__
的 class 的名称。
显然这是不可能的 python 2.7(?)
我可以将 classname 作为参数传递吗?对于调用此装饰器的方法?
即如果 testmethod
调用 metaclass 装饰器并传递 Testclass
作为参数。所以如果我知道 func.__name__
来自特定的 class 做特定的事情。
您忘记 return 装饰器的包装器。应该是:
class Metaclass(type):
def __new__(self, name, bases, attrs):
for k, v in attrs.iteritems():
if isinstance(v, types.FunctionType):
attrs[k] = self.decorator(v)
return super(Metaclass, self).__new__(self, name, bases, attrs)
@classmethod
def decorator(cls, func):
def wrapper(*args, **kwargs):
print(func.__name__)
return wrapper
您现在可以使用元class:
>>> class TestClass(object):
__metaclass__ = Metaclass
def foo(self):
return "bar"
>>> t = TestClass()
>>> x = t.foo()
foo
>>> print x
None
该方法已被包装器正确替换。
在您之前(现已删除)的问题中,您要求 print "this method is from Testclass"。您可以简单地将 class 名称传递给装饰器:
class Metaclass(type):
def __new__(self, name, bases, attrs):
for k, v in attrs.iteritems():
if isinstance(v, types.FunctionType):
attrs[k] = self.decorator(v, name)
return super(Metaclass, self).__new__(self, name, bases, attrs)
@classmethod
def decorator(cls, func, name):
def wrapper(self, *args, **kwargs):
print "%s defined in %s called from %s instance" % (func.__name__,
name, self.__class__.__name__)
return func(self, *args, **kwargs)
return wrapper
您现在获得:
>>> class TestClass(object):
__metaclass__ = Metaclass
def foo(self):
return "bar"
>>> t = TestClass()
>>> x = t.foo()
foo defined in TestClass called from TestClass instance
>>> print x
bar
我有元class喜欢:
class Metaclass(type):
def __new__(self, name, bases, attrs):
for k, v in attrs.iteritems():
if isinstance(v, types.FunctionType):
attrs[k] = self.decorator(v)
return super(MetaClass, self).__new__(self, name, bases, attrs)
@classmethod
def decorator(cls, func):
def wrapper(*args, **kwargs):
print(func.__name__)
但我无法得到 func.__class__.__name__
它打印 metaclass。我想获取 func.__name__
的 class 的名称。
显然这是不可能的 python 2.7(?)
我可以将 classname 作为参数传递吗?对于调用此装饰器的方法?
即如果 testmethod
调用 metaclass 装饰器并传递 Testclass
作为参数。所以如果我知道 func.__name__
来自特定的 class 做特定的事情。
您忘记 return 装饰器的包装器。应该是:
class Metaclass(type):
def __new__(self, name, bases, attrs):
for k, v in attrs.iteritems():
if isinstance(v, types.FunctionType):
attrs[k] = self.decorator(v)
return super(Metaclass, self).__new__(self, name, bases, attrs)
@classmethod
def decorator(cls, func):
def wrapper(*args, **kwargs):
print(func.__name__)
return wrapper
您现在可以使用元class:
>>> class TestClass(object):
__metaclass__ = Metaclass
def foo(self):
return "bar"
>>> t = TestClass()
>>> x = t.foo()
foo
>>> print x
None
该方法已被包装器正确替换。
在您之前(现已删除)的问题中,您要求 print "this method is from Testclass"。您可以简单地将 class 名称传递给装饰器:
class Metaclass(type):
def __new__(self, name, bases, attrs):
for k, v in attrs.iteritems():
if isinstance(v, types.FunctionType):
attrs[k] = self.decorator(v, name)
return super(Metaclass, self).__new__(self, name, bases, attrs)
@classmethod
def decorator(cls, func, name):
def wrapper(self, *args, **kwargs):
print "%s defined in %s called from %s instance" % (func.__name__,
name, self.__class__.__name__)
return func(self, *args, **kwargs)
return wrapper
您现在获得:
>>> class TestClass(object):
__metaclass__ = Metaclass
def foo(self):
return "bar"
>>> t = TestClass()
>>> x = t.foo()
foo defined in TestClass called from TestClass instance
>>> print x
bar