如何解决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__
的列,则可能会破坏代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。