Python父类是否可以通过子类或动态属性修改?

2024-09-29 04:31:39 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我甚至不确定我想做的事是否可行,但我想我会问清楚的

我想通过python构建一个chef“databag”。这几乎只是一本python字典。对于这个封装在databag类中的databag,还需要做其他事情

现在是问题的实质。。。 我想向这个字典添加键/值,但需要以易于扩展的方式构建它。注意:autodict是一个类,它使您可以使用点表示法构建字典

以下是我想做的:

databag = Databag(
  LogGroup=Sub("xva-${environment}-${uniqueid}-mygroup"),
  RunList=[
    "mysetup::default",
    "consul::client"
  ]
)
databag.Consul()  <-- Trying to add consul key/values to databag
print(databag.to_dict())
print(databag.to_string_list())

所以您可以看到我如何将“consur”键值添加到已经存在的databag对象中

下面是类定义。我知道这是错误的,这就是为什么我在这里,看看这是否是可能的

Databag Class

class Databag(object):

def __init__(self,uniqueid=Ref("uniqueid"),environment=Ref("environment"),LogGroup=None,RunList=[]):
    self.databag = autodict()
    self.databag.uniqueid = uniqueid
    self.databag.environment = environment
    self.databag.log.group = LogGroup
    self.runlist=RunList

def to_string_list(self):
    return self.convert_databag_to_string(self.databag)

def to_dict(self):
    return self.databag

def get_runlist(self):
    return self.convert_to_runlist_string(self.runlist)

Consul Class

class Consul(Databag):

  def __init__(self, LogGroup=None):
      if LogGroup == None:
          Databag.consul.log.group = Databag.log.group
      else:
          Databag.consul.log.group = LogGroup

如您所见,Consul类应该访问Databag类的databag字典,并添加“consur”变量,就像属性一样。但是,我不想每次都向databag类添加一个新函数,否则这个类最终会非常非常大


Tags: toselflogstring字典environmentdefgroup
1条回答
网友
1楼 · 发布于 2024-09-29 04:31:39

我能用下面的方法得到这样的东西。尽管我正在寻求一个建议来让这个工作。我刚看了这个链接上的帮助:

http://www.qtrac.eu/pyclassmulti.html

编辑:此方法简单得多:

注意:这使用与旧方法完全相同的实现

consul.py

from classes.databag.utils import *

class Consul:
    def Consul(self, LogGroup=None):
        if LogGroup == None:
            self.databag.consul.log.group = self.databag.log.group
        else:
            self.databag.consul.log.group = LogGroup

databag.py

from classes.databag.utils import autodict
from classes.databag import consul

class Databag(consul.Consul):

    def __init__(self,uniqueid=Ref("uniqueid"),environment=Ref("environment"),LogGroup=None,RunList=[]):
        self.databag = autodict()
        self.databag.uniqueid = uniqueid
...
...

Folder Structure

/classes/
    databag/
        utils.py
        databag.py
        consul.py
testing.py

旧方法-

How I implemented it

from classes.databag.databag import *

databag = Databag(
    LogGroup=Sub("xva-${environment}-${uniqueid}-traefik"),
    RunList=[
        "mysetup::default",
        "consul::client"
    ]
)
databag.Consul()

print(databag.to_dict())
print(databag.to_string_list())

lib.py

def add_methods_from(*modules):
    def decorator(Class):
       for module in modules:
           for method in getattr(module, "__methods__"):
               setattr(Class, method.__name__, method)
       return Class
return decorator

def register_method(methods):
    def register_method(method):
        methods.append(method)
        return method
    return register_method

databay.py

from classes.databag import lib, consul

@lib.add_methods_from(consul)
class Databag(object):

    def __init__(self,uniqueid=Ref("uniqueid"),environment=Ref("environment"),LogGroup=None,RunList=[]):
        self.databag = autodict()
        self.databag.uniqueid = uniqueid
    ....
    ....

consul.py

from classes.databag import lib

__methods__ = []
register_method = lib.register_method(__methods__)

@register_method
def Consul(self, LogGroup=None):
    if LogGroup == None:
        self.databag.consul.log.group = self.databag.log.group
    else:
        self.databag.consul.log.group = LogGroup

Folder Structure

/classes/
    /databag
        lib.py
        databag.py
        consul.py
        utils.py
/testing.py

相关问题 更多 >