【问题标题】:python static class with static method that uses self?带有使用self的静态方法的python静态类?
【发布时间】:2012-12-10 08:27:13
【问题描述】:

我正在 pycassa 中执行数据库插入脚本。我想建立一个公共静态类,它定义了一些变量,这些变量稍后会被其他函数大量使用。这就是我所拥有的......

class ks_refs():
    pool = ConnectionPool('TweetsKS')

    user_name_cf = self.cf_connect('UserName')
    user_tweet_cf = self.cf_connect('UserTweet')

    def cf_connect(column_family):
        cf = pycassa.ColumnFamily(self.pool, column_family)
        return cf

我什至还没有尝试运行它,因为我确信它不会工作。你可以看到我首先想要这个静态变量 'pool',然后使用需要 'pool' 工作的 cf_connect 方法设置 user_name_cf 和 user_tweet_cf(以及稍后更多)。

我知道我可以把那个方法放在类之外,或者我可以有这个非静态的并创建一个实例,但我想试试这个,因为这是我真正想要的(在我只是使用全局变量之前,但是我认为拥有所有这些的静态类是最好的主意)

【问题讨论】:

  • 我认为static method 是指class method(Python 不是 C++)。然而,在我看来,这样做只不过是将一堆东西包装到一个命名空间中,这本身就很好,但它并不比只使用通常被认为是不好的编程习惯的全局变量好多少。
  • 干杯!是的,我更熟悉 C# 中的这类东西

标签: python class static static-methods


【解决方案1】:

我想你想要一个 class 方法来代替:

@classmethod
def cf_connect(cls, column_family):
    cf = pycassa.ColumnFamily(cls.pool, column_family)
    return cf

现在您可以轻松引用在您的类中定义的池。

但是,您的 user_name_cfuser_tweet_cf“属性”将不起作用。您可以在创建类定义后添加这些:

class ks_refs():
    pool = ConnectionPool('TweetsKS')

    @classmethod
    def cf_connect(cls, column_family):
        cf = pycassa.ColumnFamily(cls.pool, column_family)
        return cf

user_name_cf = ks_refs.cf_connect('UserName')
user_tweet_cf = ks_refs.cf_connect('UserTweet')

它们是模块级常量,或者您可以在事后将它们作为属性添加到类中:

ks_refs.user_name_cf = ks_refs.cf_connect('UserName')
ks_refs.user_tweet_cf = ks_refs.cf_connect('UserTweet')

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2011-07-11
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多