gpt4 book ai didi

python - 重载类变量(属性)的Pythonic方法是什么?

转载 作者:行者123 更新时间:2023-12-01 01:20:22 26 4
gpt4 key购买 nike

你好!

我需要每个子类都有自己的一组常量。我找到了一种使用属性和重载 setter 方法的“正确”方法,但是:

  1. 我需要在子类中定义构造函数(我不需要)并在构造函数中赋值;
  2. 类的每个实例都会在内存中拥有该常量的副本(无意义的资源消耗);
  3. 当您定义 setter、getter 和 property 只是为了将其用作常量时,这看起来很奇怪。

我做了这样的事情:

class BaseClass:
def get_a(self):
raise NotImplementedError("Oooops")

def get_b(self):
raise NotImplementedError("Oooops")

class FirstClass(BaseClass):
def get_a(self):
return "a"

def get_b(self):
return "b"

class SecondClass(BaseClass)
def get_a(self):
return "A"

def get_b(self):
return "B"

class SomeClass:
def some_method(self, class_param):
return "{}-{}".format(class_param.get_a, class_param.get_b)

这个方法也没有解决带有属性的方法的问题(除了最后一个),只是更紧凑。还有其他方法,我觉得不好:

class BaseClass:
pass

class FirstClass(BaseClass):
A_CONST = "a"
B_CONST = "b"

class SecondClass(BaseClass)
A_CONST = "A"
B_CONST = "B"

class SomeClass:
def some_method(self, class_param):
return "{}-{}".format(class_param.A_CONST, class_param.B_CONST)

事实上,它解决了所有问题并且非常紧凑,但它违反了继承规则(不是吗?)。

问题:执行此操作的正确方法是什么?

P.S.提供的代码是简化示例,基类包含我在子类中使用的方法,请不要写信给我基类在这里没用。

最佳答案

如果你希望你的基类表明它需要使用某些属性进行子类化,你可以将其设置为 abstract base class .

from abc import ABC, abstractmethod

class Base(ABC):
@property
@abstractmethod
def a(self):
raise NotImplementedError
@property
@abstractmethod
def b(self):
raise NotImplementedError

然后您将无法实例化Base或其子类,除非它们重写了抽象方法。您可以执行以下任一操作

class First(Base):
a = 1
b = 2

用这些名称分配类属性,或

class Second(Base):
@Base.a.getter
def a(self):
return 3
@Base.b.getter
def b(self):
return 4

第二种方法的好处是,如果您尝试分配给属性,它会引发错误

Second().a = 5  # AttributeError

关于python - 重载类变量(属性)的Pythonic方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53899378/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com