繁体   English   中英

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

[英]How to not put self. when initializing every attribute in a Python class?

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

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

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”方式?

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

澄清: self不是Python中的关键字。 在原则上,你可以给,你应该把它的方法的任何名称的第一个参数,但约定的任务self

你不会交任何朋友,但有一种方式....:

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"]))

这是你可以避免所有过度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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM