我是使用python进行OOP的新手。我有3个类,其中一个作为参数实例从另一个调用:
class Characters:
def __init__(self, b="", c = ""):
self.b= b
self.c= c
class Words:
def __init__(self, charss=Characters()):
self.charss= charss
class Sentences:
def __init__(self, w=Words()):
self.w = w
然后我在另一个类中创建一个新的类Words实例,并用json文件中的数据填充它。
s = Sentences()
s.__dict__ = json.loads(output.content)
调试时,我可以看到s
已正确填充。然后我尝试打印s
这样的值:
print(s.w[0].charss[0])
发生错误:AttributeError: 'dict' object has no attribute 'charss'
是因为我从JSON
填充__dict__
,其中charss
实例化为list
。如果是这样,那么将__dict__
从json
输入更改为__dict__
或将对象实例化为from pyspark.sql.functions import udf, struct
@udf("array<string>")
def as_basket(row):
return [k for k, v in row.asDict().items() if v]
df.withColumn("basket", as_basket(struct(*df.columns[1:]))).show()
的最佳解决方案是什么?
答案 0 :(得分:1)
问题在于访问实例s
进行打印的方式。我将json输出保存为字典,但默认情况下,类的实例是一个列表。因此,而不是
print(s.w[0].charss[0])
该行应为
print(s.w[0]["charss"][0])
答案 1 :(得分:0)
当您说s.__dict__ = some_dictionary
时,您完全将s
的所有实例变量替换为some_dictionary
中的变量。这包括w
,现在完全由JSON中的任何内容定义。 JSON对象永远不会具有charss
属性,因此保证以您提及的方式失败。
你想用s.__dict__ = json.loads(output.content)
做什么?您只想将字典存储在s
中吗?如果是这样,s.my_cool_dict_name = json.loads(output.content)
可能就是您想要的。