为了账号安全,请及时绑定邮箱和手机立即绑定

我可以在类中设置类变量吗?

我可以在类中设置类变量吗?

RISEBY 2023-10-31 14:32:08
考虑以下简单的类:class ExampleClass():    def __init__(self, foo):        self.foo = foo    def calc_bar(self):        baz = self.get_baz()        return baz * self.foo    @staticmethod    def get_baz():        return <result of unchanging database query>然后我将它与以下内容一起使用:from module1 import ExampleClassfoo = 10myobj = ExampleClass(foo)bar = myobj.calc_bar()每次我调用该calc_bar方法时都会查询当前构建数据库的方式。如何将get_baz方法的输出转换为只为该类设置一次的类属性?我可以通过以下方式手动完成:class ExampleClass():    baz = None    def __init__(self, foo):        self.foo = foo    def calc_bar(self):        return self.baz * self.foo---from module1 import ExampleClassExampleClass.foo = <result of unchanging database query>foo = 10myobj = ExampleClass(foo)bar = myobj.calc_bar()有没有一种方法可以在班级内自动完成?
查看完整描述

3 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

get_baz您可以简单地缓存第一次调用时的值。


class ExampleClass:

    _baz = None


    def __init__(self, foo):

        self.foo = foo


    def calc_bar(self):

        baz = self.get_baz()

        return baz * self.foo


    @classmethod

    def get_baz(cls):

        if cls._baz is None:

            cls._baz = <result of query>

        return cls._baz


查看完整回答
反对 回复 2023-10-31
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

get_baz您可以简单地缓存第一次调用时的值。


class ExampleClass:

    _baz = None


    def __init__(self, foo):

        self.foo = foo


    def calc_bar(self):

        baz = self.get_baz()

        return baz * self.foo


    @classmethod

    def get_baz(cls):

        if cls._baz is None:

            cls._baz = <result of query>

        return cls._baz


查看完整回答
反对 回复 2023-10-31
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

一种选择是将其定义baz为None,然后仅在其为 时才进行get_baz()更新。bazNone


class ExampleClass:

    baz = None

    def calc_bar(self):

        return self.get_baz() * 2

        

    @classmethod

    def get_baz(cls):

        if cls.baz is None:

           cls.baz = 'hello' # <result of query>

        return cls.baz


ec = ExampleClass()


print(ec.baz)

# Output: None


print(ec.calc_bar())

# Output: hellohello


print(ec.baz)

# Output: hello


查看完整回答
反对 回复 2023-10-31
  • 3 回答
  • 0 关注
  • 74 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信