类工厂产生简单的类结构类?

发布于 2021-01-29 17:50:00

在研究Ruby时,我遇到了这个问题,创建了一个简单的类似Struct的类:

Person = Struct.new(:forname, :surname)
person1 = Person.new('John', 'Doe')
puts person1  #<struct Person forname="John", surname="Doe">

这给我提出了一些Python问题。我已经在Python中编写了此机制的[VERY]基本克隆:

def Struct(*args):
    class NewStruct:
        def __init__(self):
            for arg in args:
                self.__dict__[arg] = None

    return NewStruct

>>> Person = Struct('forename', 'surname')
>>> person1 = Person()
>>> person2 = Person()
>>> person1.forename, person1.surname = 'John','Doe'
>>> person2.forename, person2.surname = 'Foo','Bar'
>>> person1.forename
'John'
>>> person2.forename
'Foo'
  1. Python中是否已经有类似的机制来处理此问题?(我通常只使用字典)。

  2. 我将如何获得Struct()创建正确__init__()参数的函数。(在这种情况下,person1 = Person('John', 'Doe')如果可能,我想执行命名参数:person1 = Person(surname='Doe', forename='John')

出于兴趣的考虑,即使有更好的Python机制,我也想回答问题2。

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    ThomasH的变体的更新:

    def Struct(*args, **kwargs):
        def init(self, *iargs, **ikwargs):
            for k,v in kwargs.items():
                setattr(self, k, v)
            for i in range(len(iargs)):
                setattr(self, args[i], iargs[i])
            for k,v in ikwargs.items():
                setattr(self, k, v)
    
        name = kwargs.pop("name", "MyStruct")
        kwargs.update(dict((k, None) for k in args))
        return type(name, (object,), {'__init__': init, '__slots__': kwargs.keys()})
    

    这允许传入参数(和命名参数)__init__()(无需任何验证-看起来很粗糙):

    >>> Person = Struct('fname', 'age')
    >>> person1 = Person('Kevin', 25)
    >>> person2 = Person(age=42, fname='Terry')
    >>> person1.age += 10
    >>> person2.age -= 10
    >>> person1.fname, person1.age, person2.fname, person2.age
    ('Kevin', 35, 'Terry', 32)
    >>>
    

    更新资料

    有一个研究如何namedtuple()在做到这一点collections.py。将创建该类并将其扩展为字符串并进行评估。还具有对酸洗等的支持。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看