В. Как следует передавать константы аргументы базовому классу Python?Python передает постоянные аргументы базовому классу
Используя типичный пример, у меня есть классы Cat
и Dog
(оба получены из Animal
). Вызов x.sound
должен вернуть соответствующее слово ("meow"
, "woof"
).
Моя проблема заключается в том, что все экземпляры класса делают тот же самый звук, и, следовательно, в то время как я могу передать sound
в Animal
:
class Animal:
def __init__(sound):
self.sound = sound
class Dog:
def __init__():
super().__init__("woof")
Это кажется расточительным, так как мы храним "woof"
в каждом случае и у меня есть миллион собак и миллиард кошек. Я мог бы использовать вместо него метод затем:
class Animal:
@staticmethod
def sound():
raise NotImplementedError("Abstract")
class Dog:
@staticmethod
def sound():
return "woof"
Но сейчас, так как мои животные все очень тихо, это легко пропустить, когда кто-то приходит и пишет Bird
класс, не читая мою кропотливо письменную документацию, и только обнаруживает они забыли метод один раз в голубой луне, когда метод фактически вызвал.
Идеально мне хотелось бы что-то вроде шаблонов C++, где сам класс Animal
принимает параметр - его нельзя пропустить без возникновения непосредственной ошибки и не занимать больше места на один экземпляр.
template<sound>
class Animal()
. . .
Есть ли способ выполнить то, что мне нужно в Python?
Я думаю, что все экземпляры собаки должны получать один и тот же фактический строковый объект из-за интернирования строк. –
Я не очень уверен, но вам может понадобиться '__slots__' для этого – vks
@PaulRooney по-прежнему получает указатель на каждый объект. Кроме того, указатель на интернированную строку будет 8 байтов в 64-битной системе, длина которой больше, чем сама строка «woof». –