Python 查找类中字段的多个定义

Python 查找类中字段的多个定义,python,class,Python,Class,我怎样才能发现一个类的主体中有多个字段定义?例如: cl类: a=‘abc’ a=‘qa’ 打印cl.a 在这里,我们得到cl.a打印为'qa'。但是,在这种情况下,是否有任何方法引发异常或发现该字段具有多个定义。 我尝试在类dict中查找,并使用dir()方法获取所有属性的列表。它们都没有显示字段的多个定义。没有“有多个定义”这样的事情。类块中的代码在创建类时运行,然后生成的变量成为类的属性。这就好像你在顶级写作一样 a = 'abc' a = 'qa' 然后想在有多个任务的情况下找出答案

我怎样才能发现一个类的主体中有多个字段定义?例如:

cl类:
a=‘abc’
a=‘qa’
打印cl.a
在这里,我们得到
cl.a
打印为
'qa'
。但是,在这种情况下,是否有任何方法引发异常或发现该字段具有多个定义。
我尝试在类dict中查找,并使用
dir()
方法获取所有属性的列表。它们都没有显示字段的多个定义。

没有“有多个定义”这样的事情。
块中的代码在创建类时运行,然后生成的变量成为类的属性。这就好像你在顶级写作一样

a = 'abc'
a = 'qa'

然后想在有多个任务的情况下找出答案;没有可供查阅的历史记录(除非在分配任务时您自己创建历史记录)。

没有“有多个定义”这样的事情。
块中的代码在创建类时运行,然后生成的变量成为类的属性。这就好像你在顶级写作一样

a = 'abc'
a = 'qa'

然后想在有多个任务的情况下找出答案;没有可查阅的历史记录(除非在赋值过程中您自己创建历史记录)。

元类的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>方法可以返回另一种映射类型作为类的属性字典使用。该映射可以允许对任何新键进行赋值,但如果对命名空间中已存在的键再次尝试赋值,则会引发异常

class AssignOnceDict(dict):
    def __setitem__(self, key, value):
        if key in self:
            raise Exception("Duplicate assignment")
        super().__setitem__(key, value)

class AssignOnceMeta(type):
    def __prepare__(name, bases, **kwargs):
        return AssignOnceDict()


class cl(metaclass=AssignOnceMeta):
    a = 1
    a = 2 # raises an exception

元类的
\uuuuu prepare\uuuu
方法可以返回另一种映射类型,用作类的属性字典。该映射可以允许对任何新键进行赋值,但如果对命名空间中已存在的键再次尝试赋值,则会引发异常

class AssignOnceDict(dict):
    def __setitem__(self, key, value):
        if key in self:
            raise Exception("Duplicate assignment")
        super().__setitem__(key, value)

class AssignOnceMeta(type):
    def __prepare__(name, bases, **kwargs):
        return AssignOnceDict()


class cl(metaclass=AssignOnceMeta):
    a = 1
    a = 2 # raises an exception

因此,您希望
cl.a
返回类似
['abc','qa']
?对于类变量,您真的需要这样做吗?还是只对实例变量(例如,方法内部的
self.a
)这样做可以吗?@Chris如果我能捕捉到这一点并引发一个异常会更好。@Blckknght我的用例目前用于类字段,但我同样感兴趣的是知道如何处理这一点,例如variableSo你想
cl.a
返回类似
['abc','qa']
?你真的需要它来处理类变量吗,或者只对实例变量(例如,
self.a
在方法内部)执行该操作是否可以?@Chris如果我能捕捉到这个并引发一个异常会更好。@Blckknght我的用例目前用于类字段,但我同样感兴趣的是知道如何处理这个问题,例如变量。在创建类的过程中,是否有某种方法在给定类的元类中跟踪到这个问题。是否有在创建类的过程中,可以通过某种方式在给定类的元类中跟踪到这一点。没错,这是在中提出并在版本3.0中添加的添加内容之一。您知道2.7有什么解决方法吗@Blckknght@sumit:不,在Python 2中您无能为力,由于元类在完成多个赋值之后才有机会参与类的创建。没错,这是3.0版中提出并添加的新增内容之一。您知道2.7版有什么解决方法吗@Blckknght@sumit:不,在Python 2中您无能为力,因为元类在完成多个赋值之后才有机会参与类的创建。