【问题标题】:Does this function necessitate a class method?这个函数是否需要一个类方法?
【发布时间】:2018-05-22 19:58:17
【问题描述】:
import json
from urllib.request import urlopen

class Website:
    def __init__(self, username, privateID):
        self.username = username
        self.privateID = privateID

    # URL's to query
    AccountBalance = 'https://website.com/private/AccountBalance?{0}?nonce={1}' # 0 requires private ID num

    TopComments = 'https://website.com/public/TopComments?nonce={0}'


    def get_AccountBalance(self):
        nonce = gen_nonce(8)
        print(json.load(urlopen(AccountBalance.format(self.privateID, nonce))))

    @staticmethod
    def gen_nonce(length):
        return ''.join([str(random.randint(0, 9)) for i in range(length)])

我仍在尝试了解何时使用不同类型的类方法,但我一直坚持我正在从事的这个项目。我的类将有多个实例,但要查询的 URL 对于所有实例都将始终保持不变,因此我将 URL 设为类变量。但是,当实际从 URL 中检索信息时,我必须使用类方法、静态方法还是抽象方法?我假设对于帐户余额,我将使用抽象,因为私有 ID 会因实例而异。 gen_nonce() 将是静态的,因为它不需要使用任何类或实例变量。但是,为了检索顶级 cmets,我会使用类方法,因为它使用类变量 url,还是使用抽象方法,因为不是每个实例都会同时调用它?

【问题讨论】:

  • 注意:不需要将其设为staticmethod。 FWIW:我基本上从不使用@staticmethod。现在,您的get_AccountBalance 不需要需要 @classmethod,但您确实需要使用self.AccountBalance 来访问类属性。或Website.AccountBalance 明确。如果您愿意,可以使用类方法。但这几乎从来没有必要
  • 你的Website 类总是有一个用户名和一个私有ID 作为数据。如果TopComments 不需要数据,为什么它是类的一部分?我认为您确实需要两个类,一个用于为网站建模,另一个用于为网站的 用户 建模。

标签: python python-3.x oop


【解决方案1】:

你在正确的轨道上。首先,抽象方法只存在于抽象基类中。如果你打算实例化一个类,你可以忽略它们。

大多数方法都是实例方法;这就是你不需要装饰它们的原因。

类方法实际上是一个替代构造函数。如果你觉得需要多个__init__方法,那么最基本的一个是__init__,其余定义为类方法,通常用__init__实现。

class Foo:
    def __init__(self, x):
        self.x = x

    @classmethod
    def from_bar(cls, b):
        return cls(b.x)

f1 = Foo(3)
b = Bar()
f2 = Foo.from_bar(b)  # Create a Foo from a Bar without having to know how that actually happens

静态方法根本不是真正的方法。它只是一个常规函数,您将其粘贴在一个类中以避免污染全局命名空间。

【讨论】:

  • 也许您打算使用cls 参数?
  • 我曾经有过self,但我以为我在你发表评论之前就已经解决了?
  • 不,我的意思是你的 from_bar 类方法不使用 cls 所以它可能只是一个普通的函数。如果你打算让它成为一个类方法,不妨使用return cls(b.x)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
相关资源
最近更新 更多