Python-函数中的类对象初始化

问题描述

| 下面的代码有效(它最终将通过sql数据库提取记录),但是我很难理解为什么下面代码中的“ 0”语句起作用。
def build_row(table,cols):
    \"\"\"Build a class that creates instances of specific rows\"\"\"
    class DaTarow:
        \"\"\"Generic data row class,specialized by surrounding function\"\"\"
        def __init__(self,data):
            \"\"\"Uses data and column names to inject attributes\"\"\"
            assert len(data)==len(self.cols)
            for colname,dat in zip(self.cols,data):
                setattr(self,colname,dat)
        def __repr__(self):
            return \"{0}_record({1})\".format(self.table,\",\".join([\"{0!r}\".format(getattr(self,c)) for c in self.cols]))
    DaTarow.table = table
    DaTarow.cols = cols.split()
    return DaTarow
什么时候确定\'data \'的长度,如何保证它与\'self.cols \'的长度相同?有人可以解释这种现象吗?     

解决方法

        如果将
self.cols
self.table
的引用替换为
self.__class__.cols
self.__class__.table
,这对您可能更有意义。造成这种混乱的原因是,通过“ 6”对象访问类属性就好像它们是实例属性一样,以及为什么我不特别喜欢这种编码习惯用法。当查看
__init__
中的代码时,通常为实例属性分配值,那么,立即查看一条读取
self.cols
值的语句就很烦人-
self.cols
的初始化位置在哪里?另一方面,如果将此断言更改为:
assert len(data)==len(self.__class__.cols)
则可以清楚地看到,数据值列表的长度应与此DataRow实例的列定义列表的长度相同。在以下语句中,类属性
cols
在类定义之后立即初始化:
DataRow.cols = cols.split()
很早就创建了任何实例-这就是该断言起作用的原因。 这段代码的作者可能会考虑转换为最新的
namedtuple
构造。     ,        实例化
build_row()
函数返回的类时,14ѭ将被赋予一个值。 不能保证与
self.cols
相同。也许您永远不会实例化该类,因此永远不会看到错误。     ,        当您定义
DataRow
时,列名将在变量ѭ2names中设置。因此,当您实例化该类时,应该填充每一列。 因此,您需要两个长度相同的列表。否则,您可能没有全部属性。 完成此操作的方法是通过设置属性的列名作为最佳选择,因为这不是最佳选择,因为如果您具有名为
cols
table
甚至是
__repr__
的列,则可能会破坏代码。