当前位置: 首页 > 面试题库 >

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

冯庆
2023-03-14
问题内容

在研究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。


问题答案:

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。将创建该类并将其扩展为字符串并进行评估。还具有对酸洗等的支持。



 类似资料:
  • 活字印刷 面向对象 话说三国时期,曹操带领百万大军攻打东吴,大军在长江赤壁驻扎,军船连成一片,眼看就要灭掉东吴,统一天下,曹操大悦,于是大宴众文武,在酒席间,曹操诗兴大发,不觉吟道:喝酒唱歌,人生真爽。众文武齐呼:“丞相好诗!于是一臣子速命印刷工匠刻板印刷,以便流传天下。” 样张出来给曹操一看,曹操感觉不妥,说到:“喝与唱,此话过俗,应该为‘对酒当歌’较好!”,于是此臣就命工匠重新来过。工匠眼看连

  • //抽象类 enum SpliterType { BinaryType = 0, TxtYype = 1 }; class ISplitter { public: virtual void split() = 0; virtual ~ISplitter() {} }; //具体类 class BinarySplitter : public ISplitter { public: voi

  • 一、简单工厂模式简介 1.定义 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 2.使用动机 考虑一个简单的软件应用场景:一个软件系统可以提供多个外观不同的

  • 本文向大家介绍Design patterns 简单工厂(Java),包括了Design patterns 简单工厂(Java)的使用技巧和注意事项,需要的朋友参考一下 示例 工厂减少了需要从对象创建代码创建对象的代码之间的耦合。不是通过调用类构造函数来显式地创建对象,而是通过调用一些代表调用者创建对象的函数。下面是一个简单的Java示例: 在此示例中,用户仅给出了有关其需求的提示,而工厂可以自由地

  • 类与继承在javascript的出现,说明javascript已经达到大规模开发的门槛了,在之前是ECMAScript4,就试图引入类,模块等东西,但由于过分引入太多的特性,搞得javascript乌烟瘴气,导致被否决。不过只是把类延时到ES6.到目前为止,javascript还没有正真意义上的类。不过我们可以模拟类,曾近一段时间,类工厂是框架的标配,本章会介绍各种类实现,方便大家在自己的框架中或

  • 数据库工厂类提供了一些方法来帮助你管理你的数据库。 Table of Contents 数据库工厂类 初始化数据库工厂类 创建和删除数据库 创建和删除数据表 添加字段 添加键 创建表 删除表 重命名表 修改表 给表添加列 从表中删除列 修改表中的某个列 类参考 初始化数据库工厂类 重要 由于数据库工厂类依赖于数据库驱动器,为了初始化该类,你的数据库驱动器必须已经运行。 加载数据库工厂类的代码如下: