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