Атрибуты класса Python во время определения с использованием функцийPython

Программы на Python
Ответить
Anonymous
 Атрибуты класса Python во время определения с использованием функций

Сообщение Anonymous »

Мне нужно установить атрибуты класса, вызвав функцию во время определения класса. Очень упрощенный пример будет выглядеть следующим образом.
class Mammal():
# Base class provided by internal library

class Dog(Mammal):
set_sound("Woof")

class Cat(Mammal):
set_sound("Meow")

Где функция set_sound(val) устанавливает атрибут класса для производного класса. Позже я смогу программно использовать эти атрибуты класса как обычно.
print( Dog.sound ) # Woof
print( Cat.sound ) # Meow

Как это достигается?
Я пытался перепроектировать гораздо более сложный фрагмент кода, выполняя то же самое, но с ограниченным успехом. У меня не получается работать должным образом, и в идеале мне не нужно создавать экземпляр для установки атрибутов:
import functools

class DirectiveMeta():
directives_to_be_executed = []

def __init__(self):
for directive in self.directives_to_be_executed:
directive(self)

@staticmethod
def directive():
def decorator(decorated_function):
@functools.wraps(decorated_function)
def wrapper(*args, **kwargs):
result = decorated_function(*args, **kwargs)
values = (result,)
DirectiveMeta.directives_to_be_executed.extend(values)
return result
return wrapper
return decorator

class Mammal(DirectiveMeta):
def __init__(self):
super().__init__()

directive = DirectiveMeta.directive

@directive()
def sound(s):
print(f'Inside sound() s = {s}')
return lambda pkg: _execute_version(pkg, s)

def _execute_version(pkg, s):
print(f'Inside _execute_version pkg = {pkg} sound = {s}')
pkg.sound = s

class Dog(Mammal):
sound("Woof")

class Cat(Mammal):
sound("Meow")

if __name__ == '__main__':
d = Dog()
#c = Cat()

#print(Dog.sound)


Подробнее здесь: https://stackoverflow.com/questions/798 ... -functions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»