Программа, которая отображает все кратные 7 от 1 до 100 C ++

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

-10
задан TTT 15 September 2017 в 13:46
поделиться