【问题标题】:How can call class method without bracket `()`? [duplicate]如何调用没有括号`()`的类方法? [复制]
【发布时间】:2021-01-27 16:28:21
【问题描述】:

我有测试类:

class Foo_class:

    def __init__(self,x=0):
        """init, x defaul as 0."""
        self.x=x

    def val(self):
        return self.x

我想明白,怎么调用:

f=Foo_class()
print(f.val)

f.val 将返回 def f.val() 的值。

有可能吗?

【问题讨论】:

  • 您可以使用描述符,例如property
  • 除非你使用装饰器,否则你不能调用这样的类方法。 f.val 将返回该方法对象在类中的地址,如下所示,<bound method Foo_class.val of <__main__.Foo_class object at 0x000002A1D9098160>>
  • 你也可以在__init__中做self.val = x... ;)

标签: python python-3.x


【解决方案1】:
class Foo_class:

    def __init__(self,x=0):
        """init, x defaul as 0."""
        self.x=x
        
    @property
    def val(self):
        return self.x

test = Foo_class()
test.val

如果你想知道发生了什么:这基本上是一个更好的 getter 和 setter 版本,因为 java 人使用它们。如果你编写一个类,你应该永远不会公开实例变量,但有一个获取/设置值的方法,这样你就可以在不破坏使用它的代码的情况下改变引擎盖下发生的事情。在 python 中暴露东西很好,因为你可以使用它。

【讨论】:

  • 纯代码答案没有太大帮助——对 OP 和未来的读者都没有——尤其是在此类更高级别的材料问题中。 property 是 Python 中一个特殊且令人困惑的装饰器,一些解释(可能是一些链接)将大大改善答案。然而,这个问题是重复的,无论如何都不应该回答......
  • @Tomerikoo 你喜欢我的详细解释吗:)?
  • 这肯定比仅使用代码的答案要好,但请查看链接副本中的答案以了解什么是详细解释 :)
猜你喜欢
  • 2021-12-03
  • 2013-12-13
  • 2015-06-12
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
相关资源
最近更新 更多