5

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

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

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 类的强大功能,我认为其他人问这个问题没有成功。

(一个相关问题:组织类属性、构造函数参数和子类构造函数默认值的大多数“pythonic”方式?

4

3 回答 3

5

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

澄清:self不是 Python 中的关键字。原则上,您可以给方法的第一个参数起任何名称,但约定要求您应该调用它self

于 2013-04-22T21:12:46.610 回答
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"]))
于 2013-04-22T21:18:52.370 回答
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 种自我用途,但如果您总是传递一个字典来确保提供您需要的属性,例如“名称”,它可以减少。

于 2013-04-22T21:33:36.613 回答