我有一个像这样的课程:
class MyClass: Foo = 1 Bar = 2
每当调用MyClass.Foo或时MyClass.Bar,我需要在返回值之前调用自定义方法。Python可能吗?我知道创建类的实例并定义自己的__getattr__方法是可能的。但是我的scnenario涉及这样使用此类而不创建任何实例。
MyClass.Foo
MyClass.Bar
__getattr__
我还需要__str__在调用时str(MyClass.Foo)调用自定义方法。Python是否提供这种选项?
__str__
str(MyClass.Foo)
__getattr__()并且__str__()对象可以在其类上找到,因此,如果要为类自定义这些内容,则需要一个类。元类。
__getattr__()
__str__()
class FooType(type): def _foo_func(cls): return 'foo!' def _bar_func(cls): return 'bar!' def __getattr__(cls, key): if key == 'Foo': return cls._foo_func() elif key == 'Bar': return cls._bar_func() raise AttributeError(key) def __str__(cls): return 'custom str for %s' % (cls.__name__,) class MyClass: __metaclass__ = FooType # in python 3: # class MyClass(metaclass=FooType): # pass print MyClass.Foo print MyClass.Bar print str(MyClass)
印刷:
foo! bar! custom str for MyClass
不,对象不能截取对其属性之一进行字符串化的请求。为属性返回的对象必须定义自己的__str__()行为。