在放弃丑陋的bash脚本后,我一直在学习如何在今天的大部分时间里使用Python。
我正在尝试使用2个类来定义一些对象数组,用于存储一些唯一的字符串和整数(1-10)。对象将包含以下内容:
object[i].user
.n # n = i
.name
.coords
.hero
(param1,param2,param3)对于每个object.n和object.user都是不同的,所以我试图在编写90个唯一字符串后使用看起来不像垃圾的赋值方法。嵌套我发现的例子不起作用,所以这是妥协:
class CityBean:
def __init__(self,name,coords,hero):
self.name = name
self.coords = coords
self.hero = hero
class Castles:
def __init__(self,user,n):
self.user = user
self.n = n
if self.user == 'user1':
temp = {
1: CityBean( "name1" , "coord1" , "hero1"),
... blah blah blah
10: CityBean( "name10" , "coord10" , "hero10" )}[self.n]()
if self.user == 'user2':
temp = {
1: CityBean( "name11" , "coord11" , "hero11" ),
... blah blah blah
10: CityBean( "name20" , "coord20" , "hero20" ) }[self.n]()
if self.user == 'user3':
temp = {
1: CityBean( "name21" , "coord21" , "hero21" ),
... blah blah blah
10: CityBean( "name30" , "coord30" , "hero30" ) }[self.n]()
self.name = temp.name
self.coords = temp.coords
self.hero = temp.coords
__del__(temp)
我用这样的话来称呼它:
cities = list( Castles("user2",i) for i in range(1,11) )
它给了我这个错误:
AttributeError: CityBean instance has no __call__ method
它归咎于这一行:
10: CityBean( "name20" , "coord20" , "hero20" ) }[self.n]() # pseudo
10: CityBean( "" , "" , "" ) }[self.n]() # what is actually looks like
我的邋classes班有什么问题?我正在做一些迟钝的事,不是吗?
答案 0 :(得分:6)
很难从你提供的内容中猜出你想要什么,因为你提供了新手代码而不是说你想做什么,所以你的猜测时间很短。
我认为这样的事情可以做到:
data = {
(1, 'user1'): ("name1", "coord1", "hero1"),
(2, 'user1'): ("name2", "coord2", "hero2"),
#...
(1, 'user2'): ("name11", "coord11", "hero11"),
(2, 'user2'): ("name12", "coord12", "hero12"),
# ...
}
class CityBean:
def __init__(self,name,coords,hero):
self.name = name
self.coords = coords
self.hero = hero
class Castles:
def __init__(self,user,n):
self.user = user
self.n = n
name, coords, hero = data.get((n, user))
self.citybean = CityBean(name, coords, hero)
答案 1 :(得分:4)
你为什么写这个?
temp = {
1: CityBean( "name21" , "coord21" , "hero21" ),
... blah blah blah
10: CityBean( "name30" , "coord30" , "hero30" ) }[self.n]()
您认为temp= {...}[something]()
会做什么?
它会创建一个字典。 {...}
它从字典中挑出一个项目。 {...}[something]
。这将是CityBean
对象。
它将一个项目评估为函数{...}[something]()
CityBean(...)()
为什么要将CityBean对象调用为函数?
此外,为什么要创建整个词典只选择一个项目? if
语句有什么问题?
答案 2 :(得分:2)
你正在做什么
{
1: CityBean( "name1" , "coord1" , "hero1"),
... blah blah blah
10: CityBean( "name10" , "coord10" , "hero10" )}[self.n]()
这基本上来自基于键的dict get值,你的dict上的值是CityBean实例,所以总之你就是这样做
CityBean( "name1" , "coord1" , "hero1")()
有效但会调用实例的特殊方法__call__
,因此请根据需要删除()
或添加__call__
方法
答案 3 :(得分:1)
我真的不明白你要做的是什么,但是:
10: CityBean( "name10" , "coord10" , "hero10" )}[self.n]()
如果调用某事(最后的()使其成为函数调用。
我想你想要的是什么 temp = {... 10:CityBean(“name10”,“coord10”,“hero10”)} [self.n]
在这种情况下,您将获得带有键n的dict条目并标记为temp。
答案 4 :(得分:1)
注意,在python中,当你写
时CityBean( "name1" , "coord1" , "hero1")
您初始化对象CityBean
。无需额外()
。
答案 5 :(得分:1)
如果你做错了,你可以解决这个问题
os.environ("METAG_DATA")
正确的方法是
os.environ["METAG_DATA"]
答案 6 :(得分:0)
将普通表达式中的类名后面的parens立即实例化。如果您想延迟实例化,那么您需要使用lambda
或functools.partial()
:
10: lambda: CityBean("", "", "")}...