Python 如何输入检查类属性

Python 如何输入检查类属性,python,class,class-properties,Python,Class,Class Properties,我有一个类MyClass,带有class属性SOMETHING: class MyClass(object): SOMETHING = 12 我希望强制执行某物,以满足特定条件,例如某物

我有一个类
MyClass
,带有class属性
SOMETHING

class MyClass(object):
    SOMETHING = 12
我希望强制执行
某物
,以满足特定条件,例如
某物<100
。 我怎么能这么做

最终,该类将由用户进行子类化,例如:

class MySubClass(MyClass):
    SOMETHING = 13

我一直在研究概述的类属性方法,但它们似乎都不能很好地定义
主体中的属性

例如:

class MyClassMeta(type):
    _SOMETHING = 0

    @property
    def SOMETHING(cls):
        return cls._SOMETHING

    @SOMETHING.setter
    def SOMETHING(cls, something):
        if something < 100:
            cls._SOMETHING = something
        else:
            raise ValueError('SOMETHING must be < 100')


class MyClass(object, metaclass=MyClassMeta):
    # this is ignored
    SOMETHING = 100


x = MyClass()
print(MyClass.SOMETHING)
# 0
print(type(x).SOMETHING)
# 0
即使使用子类化,它也可以正常工作:

class MySubClass(MyClass):
    SOMETHING = 40


y = MySubClass()
print(MySubClass.SOMETHING)
# 50
print(type(y).SOMETHING)
# 50
除了子类中的设置
SOMETHING
也被忽略之外


那么,当
的主体中定义了
某物
时,如何触发
@SOMETHING.setter
代码的执行呢。使用两个下划线保存从外部访问属性的权限。 第二:如果从基类继承,则该属性仍然可用。不需要新定义它。

使用以下简单的元类实现来验证类 声明阶段的特定属性:

跑步投掷:

ValueError: MyChildClass.SOMETHING should be less than 100

对不起,你能解释清楚一点吗?我真的不明白这是怎么回答我的问题的。@MarLei:你说得对。你能写一个清楚的答案吗?简言之,您只需将“\u SOMETHING”替换为“\u SOMETHING”(添加下划线),您的问题就解决了solved@ma3oun你能把这个拿出来吗?我100%肯定在任何Python代码的任何地方更改自定义名称(也称为)都不会影响代码执行,但如果您碰巧发现类似的情况,应该立即报告为错误。我想到的示例适用于对象属性,而不是类变量。抱歉搞砸了谢谢!我在研究
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
作为解决这一问题的可能方法,但官方文档对我来说还不够。
class MyClassMeta(type):
    def __new__(cls, clsname, bases, clsdict):
        if clsdict['SOMETHING'] >= 100:  # validate specific attribute value
            raise ValueError(f'{clsname}.SOMETHING should be less than 100')
        return type.__new__(cls, clsname, bases, clsdict)


class MyClass(metaclass=MyClassMeta):
    SOMETHING = 12


class MyChildClass(MyClass):
    SOMETHING = 100
ValueError: MyChildClass.SOMETHING should be less than 100