怎么不把自己。什么时候初始化Python类中的每个属性?

时间:2013-04-22 21:11:14

标签: python

问候。
我搜索了很长时间,发现了很多相关的问题而我没有答案。尽管我似乎是一个简单的初学者怀疑。

我们有一个(我猜)典型的类定义:

class Town:
    def __init__(self, Name, Ruler = "Spanish Inquisition"):
        self.Name = Name
        self.Population = 0
        self.LocationX = 0
        self.LocationY = 0
        self.Religion = "Jedi"
        self.Ruler = Ruler
        self.Products = ["Redstone", "Azaleas"]

你明白了。很多属性。我需要所有这些。

问题是:**是否有保存所有“自我”的捷径?**我是不是太懒了?我希望有类似的东西:

with self:
    Name = Name
    Population = 0
    ...

当然我知道它不起作用(这不是“with”的用法,而且参数是在一个错误的命名空间中。...我做对了吗?)。

我想有很多替代方案可以达到相同的结果,但我真的很好奇Python类的强大功能,而且我认为其他人对此问题没有成功。

(相关问题:Most "pythonic" way of organising class attributes, constructor arguments and subclass constructor defaults?

3 个答案:

答案 0 :(得分:5)

简答:不,你不能。在Python中访问实例成员(属性,方法)时,必须使用self

澄清:self不是Python中的关键字。原则上,您可以为方法的第一个参数指定任何名称,但约定要求您将其称为self

答案 1 :(得分:5)

你不会交任何朋友,但是单向......:

class Town2:
    def __init__(self, name, ruler = 'Spider Pig'):
        self.__dict__.update(dict(
            Name = name,
            Population = 0,
            LocationX = 0,
            LocationY = 0,
            Religion = "Jedi",
            Ruler = ruler,
            Products = ["Redstone", "Azaleas"]))

答案 2 :(得分:3)

这是一种可以避免所有过度self的方法,在与DRY保持一致的同时输入:

class Town(object):
    def __init__(self, name, data={}):
        setattr(self, 'name', name)
        for k,v in data.iteritems():
            setattr(self, k, v)


default_town_info = {
    'population': 0,
    'location_x': 0,
    'location_y': 0
    }

a = Town('foo', default_town_info)
print a.name
print a.population
print a.location_x

这仍然允许您访问您的属性,返回:

foo
0
0

所以是的,有2个自我使用,但是如果你总是传递一个字典来确保提供你需要的属性,例如'name',它就可以减少。