问题 Pycharm(@property)和(@ x.setter)自动生成


我想知道是否有某种方法可以使用Pycharm为类中的所有变量自动生成getter(@property)或setter。

如果有办法,有人可以指出吗?


谢谢!实际上我的意思是自动生成(@property)和(@ x.setter)。


2138
2018-01-28 10:23


起源

如果有,就不应该有。您应该只在实际需要时使用getter和setter。 - Daniel Roseman
在python中,您不需要使用getter和setter来保证API的安全。 - bgusach
为什么不做一个片段呢? - Games Brainiac
@DanielRoseman感谢您的提醒。 - Alex Gao


答案:


没有办法这样做。您可以提取代码的某些部分,但不能让pycharm为您生成getter和setter。也没有必要,因为所有变量都是公共的,而且 _var 值虽然被视为私有变量,但也可以更改。

编辑(有问题的变化):

如果你想在制作getter和setter时编写更少的代码,那么只需使用 props 或者 propsdPyCharm中的片段。


12
2018-01-28 11:07



你仍然可以使用Obj .__ x隐藏一些变量,对吗? - Alex Gao
您可以使用前导隐藏属性 __,但你无法保护对它的访问。如果您想明确该属性仅供内部使用,请使用一个(!)前导下划线。 - Matthias
@Matthias这就是我的意思,你可以随时访问Python中的东西。一切都是公开的。 - Games Brainiac
代码就像 pastebin.com/pg85f6KY 给出AttributeError:p实例没有属性'__h'。我认为这意味着你不能以__开头访问变量。 - Alex Gao
@Alex Gao:不,那只是你必须考虑名字破坏的menas。使用 print b_1._p__h 你会得到数据。 - Matthias


没有必要。吸气剂和制定者的观点是

  • 限制访问(比如使用read-only)
  • 维护API(以便您可以更改基础字段或添加一些处理)。

第一个不能用Python实现,第二个不能在任何地方使用getter和setter。

如果你有

class Person(object):

    def ___init__(self, full_name):
        self.full_name = full_name

并决定拥有 name 和 surname 相反,你可以添加

    @property
    def full_name(self):
        return self.name + " " + self.surname

    @full_name.setter
    def full_name(self, value):
        self.name, self.surname = value.split()

不破坏API。


4
2018-01-28 11:20



不回答这个问题。 - Games Brainiac
“我该如何自杀?” “不要”“不回答问题”技术上你是对的。 - Bartosz Marcinkowski
嗨,为什么不能第一个实现。我想你仍然可以使用Obj .__ x隐藏变量,对吧? - Alex Gao
前缀如 __ 只是一个惯例,他们不会阻止任何事情。您可以获取或设置名为的变量 __x  - 它没有隐藏。 - Bartosz Marcinkowski
实际上他们做到了 某物而不是访问通过 obj.__x 你必须通过它访问它 obj._Obj__x,所以它有点隐藏,但不是真的。 - dav1d