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 面向对象专题:私有成员类方法静态方法属性isinstance/issubclass