在Python中定义一个类时,如何将一个值赋给多个变量?

2024-09-20 23:04:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经开始迈出学习python的第一步,并尝试开始使用类。在

到目前为止,我有一个简化版本:

class ThingsInTheFridge(object):
  def __init__(self):
    self.milk = False
    self.yogurt = False
    self.bread = True
    self.umbrella = True

在我的课堂上会有大约30件事,每件事都有正确或错误的分配(我已经缩短了这个问题的列表)。在

最有效的分配方法是什么?在

我考虑过这一点,但似乎并没有改善任何事情,尤其是当列表的大小增加时:

^{pr2}$

编辑: 我也许应该提到班上还有其他项目(我省略了它们,因为我认为这无关紧要):

class ThingsInTheFridge(object):
  def __init__(self):
    self.milk = False
    self.yogurt = False
    self.bread = True
    self.umbrella = True
    self.bulb = "maker name"
    self.shoes = 2

Tags: self版本falsetrue列表objectinitdef
3条回答

如果你真的关心运行时的效率,你几乎肯定找错地方了。如果初始化成员花费的时间太长(这不太可能…但是如果您分析并发现这是热点…),正确的答案是使用^{},而不是更改初始化的方式。在

如果您关心程序员效率(可读性,以及较小程度上的可写性),您可以始终这样做:

self.milk = self.yogurt = False

如果您想更动态地执行操作,可以使用^{}执行类似的操作,但我不建议这样做:

^{pr2}$

我不推荐它的原因是,如果您需要在这个级别上动态地做事情,那么您可能还需要在access级别保持动态,这意味着您确实应该使用dict或{},正如Lattyware所解释的那样。在

您也可以在类样式系统的基础上为自己构建一个原型样式的OO系统,或者创建一个基于类信息初始化实例的元类,等等,但是,正如这句话的开头所指出的那样,这将是过分的。在

我认为这显示了你存储数据的模型有问题。您可能希望使用像集合这样的数据结构,而不仅仅是属性。在

例如:

items = {"milk", "yogurt", "bread", "umbrella"}
stored = set()

然后只需将所需的存储在stored集中。集合对于成员身份检查有非常快的性能,因此要进行检查,可以简单地执行"milk" in stored。在

如果您真的想保留现有的接口,可以使用__getattr__()来覆盖请求属性时的操作:

^{pr2}$

这将使False返回到冰箱中没有的任何东西,如果您需要它只对可能的项目做出响应,这很容易做到:

def ___getattr__(self, item):
    if item not in self.items:
        raise AttributeError
    return item in self.stored

当然,也可以设置:

def __setattr__(self, item, value):
    if item in self.items:
        if value:
            self.stored.add(item)
        else:
            self.stored.remove(item)
    else:
        ...

另一种选择是对True/False的一种说法——我不能说我认为两者都是特别好的,一种可能更适合你的项目。只要用最适合你的。在

我认为您的主要关注点应该是可读性和底层数据结构。在

类似这样的东西非常易读,而且(很可能)您可以通过自己的滚动实现高性能:

from collections import Counter

class Fridge(object):
    def __init__(self,things,name):
        self.things=Counter(things)
        self.wanted=set()
        self.name=name

    def look(self, thing):
        print 'There are {} {} in {}'.format(self.things[thing],thing,self.name)

    def stare_inside(self):
        cathave=sorted([(co,it) for it,co in self.things.items() if co])
        print '{} items in {}:'.format(len(cathave),self.name)
        for i, item in enumerate(cathave,1):
            print '   {}: {} -- {}'.format(i,item[1],item[0])

    def shop(self):
        shop_list=[it for it,co in self.things.items() if co==0]
        for item in shop_list:
            del self.things[item]
        shop_list.extend(list(self.wanted))
        self.wanted=set()
        print "shopping list:"
        for i, item in enumerate(sorted(shop_list),1):
            print '   {}: {}'.format(i,item)    

    def consume(self,thing,count):
        if self.things[thing]>=count:
            self.things[thing]-=count   
        else: 
            print 'Not enough {} to consume {} -- {} in the {}.'.format(
                  thing,count,self.things[thing],self.name)
            self.wanted.add(thing)

    def stock(self,things):
        self.things+=Counter(things)

现在试试看:

^{pr2}$

这是基于collection module Counter class.你不太可能想出更快的原生Python。在

相关问题 更多 >

    热门问题