__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__()
.