问候。
我搜索了很长时间,发现了很多相关的问题而我没有答案。尽管我似乎是一个简单的初学者怀疑。
我们有一个(我猜)典型的类定义:
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类的强大功能,而且我认为其他人对此问题没有成功。
答案 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',它就可以减少。