【问题标题】:How to not put self. when initializing every attribute in a Python class?如何不放自我。在初始化 Python 类中的每个属性时?
【发布时间】:2013-04-22 21:11:14
【问题描述】:

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

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

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?

【问题讨论】:

  • 如果你经常遇到这个问题,我建议你看看你的文本编辑器是否允许你创建宏。每行键入一个属性名称(因此,一行将只显示name),然后在行上运行宏将name 更改为self.name = name。此外,您应该尝试养成使用正确命名约定的习惯。所有这些参数和属性should be lowercase
  • 加一票“只需输入self”。

标签: python


【解决方案1】:

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

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

【讨论】:

  • @deathApril 从技术上讲是正确的,但由于约定是self,因此使用其他东西会使您的代码更难阅读、维护和使用。这个约定是如此根深蒂固,如果你使用其他东西,你会遇到代码自动完成和格式化工具的问题。
  • 尽管没有办法避免self,但肯定有办法避免重新输入它...
【解决方案2】:

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

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

【讨论】:

  • 小耶稣,他在哭。此外,这将阻止大多数使用属性或其他描述符的尝试。
  • 标尺应该是荷马。蜘蛛猪!
  • @sr2222 确实如此 - 但希望它会明白输入 self. 并不难...... ;)
【解决方案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 种自用,但如果您始终传递确保提供所需属性的字典(例如“名称”),则可以减少自用。

【讨论】:

  • 这就是字典的力量,而不是课堂。我会试一试。也谢谢你!
猜你喜欢
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多