Python - 从私有静态方法设置类变量

Posted

技术标签:

【中文标题】Python - 从私有静态方法设置类变量【英文标题】:Python - set class var from a private static method 【发布时间】:2021-12-29 04:56:56 【问题描述】:

我在 python 中编写了以下基本静态类:

from abc import ABC,abstractmethod

import typing
from main_module import utils


class BaseCLS(ABC):
    credentials = None # <--- I want to set this var
    def __init_session(caller) -> None:
        credentials = utils.get_creds() # <--- not the right var

    @staticmethod
    @__init_session
    def process(path: str) -> None:
        raise NotImplementedError

每次调用process 时,装饰器都会触发基类私有方法__init_session。我正在尝试从私有方法中设置 credentials 类变量,但没有成功。我怎样才能实现我的目标?

【问题讨论】:

除了简单的BaseCLS.credentials = ... 之外,我看不出你怎么能做到这一点,因为你使用的是 static 方法,它既不能访问实例也不能访问上课…… 谢谢,但我收到一个错误 NameError: name 'BaseCLS' is not defined Err,真的,因为装饰器在类存在之前运行......然后我看到它可以按原样工作的选项更少。这个设计中的某些东西必须给予,目前还不清楚可以在这里给予什么。 这不是装饰器的工作方式。 @__init_session 不会在每次调用 process 时调用 __init_session。它在定义process 时调用__init_session 一次,并将process 本身作为单个参数传递给__init_session。您应该阅读装饰器语义和技术。此外,静态方法和类变量的使用似乎很奇怪,尤其是在似乎打算成为抽象类的情况下。 另外,“基本静态类”没有意义。我不知道您试图按顺序使用这些词来表达什么意思,但是 Python 中没有“静态类”或“基本静态类”之类的东西。 【参考方案1】:

如果要在派生类中设置类变量,以下方法可行。

from abc import ABC,abstractmethod
import typing
import random

class BaseCLS(ABC):
    credentials = None # <--- I want to set this var

    def __init_session(caller) -> None:
        def inner(cls, path):
            # credentials = utils.get_creds()
            cls.credentials = random.random()
            caller(cls, path)
        return inner

    @classmethod # <--- changed to classmethod
    @__init_session
    def process(cls, path: str) -> None:
      pass

class B(BaseCLS):
  pass

class C(BaseCLS):
  pass


B.process("a")
C.process("b")

print(B.credentials)
print(C.credentials)

【讨论】:

以上是关于Python - 从私有静态方法设置类变量的主要内容,如果未能解决你的问题,请参考以下文章

面向对象的成员: 实例变量 类变量 实例方法 类方法 静态方法 属性 私有

python 面向对象(成员,静态,类)的(变量,方法)区别

Python之类的成员

python 面向对象专题:私有成员类方法静态方法属性isinstance/issubclass

python 面向对象专题:私有成员类方法静态方法属性isinstance/issubclass

python面向对象中的,变量,方法与属性