Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 新构造函数的常见做法?_Python_Constructor - Fatal编程技术网

Python 新构造函数的常见做法?

Python 新构造函数的常见做法?,python,constructor,Python,Constructor,我知道(?)Python中\uuuu new\uuuu构造函数背后的理论,但我要问的是常见的实践——这个构造函数真正的用途是什么 我读过关于初始化不可变对象的内容(逻辑从\uuuu init\uuuuuu移动到\uuu new\uuuuuuu),还有别的吗?工厂模式 请再次注意区别: 对于什么任务可以使用\uuuuuu new\uuuuuu,我不感兴趣 对于哪些任务使用了\uuuu new\uuu,我是:-) 我没有用Python写任何东西,我的知识来自阅读,而不是经验 实际上,您可以回答以

我知道(?)Python中
\uuuu new\uuuu
构造函数背后的理论,但我要问的是常见的实践——这个构造函数真正的用途是什么

我读过关于初始化不可变对象的内容(逻辑从
\uuuu init\uuuuuu
移动到
\uuu new\uuuuuuu
),还有别的吗?工厂模式

请再次注意区别:

  • 对于什么任务可以使用
    \uuuuuu new\uuuuuu
    ,我不感兴趣
  • 对于哪些任务使用了
    \uuuu new\uuu
    ,我是:-)
我没有用Python写任何东西,我的知识来自阅读,而不是经验


实际上,您可以回答以下问题:

新的
的要点是创建一个空的对象实例,然后初始化它。重新实现
\uuuuu new\uuuuuu
您可以完全控制您创建的实例,但是您没有真正使用
\uuuuuuu init\uuuuuuu
方法来执行任何进一步的处理。我可以给出两个有用的例子:自动创建方法和使用智能构造函数从磁盘反序列化类。这不是解决这两个问题的唯一方法。元类是另一种更灵活的方法,但作为任何工具,您可能希望获得不同程度的复杂性

自动创建方法

假设您想要一个具有给定属性集的类。您可以使用如下代码控制这些属性的初始化方式

class Foo(object):                                                                                                                                    
    properties = []                                                                                                                                   
    def __new__(cls, *args):                                                                                                                          
        instance = object.__new__(cls, *args)                                                                                                         
        for p in cls.properties:                                                                                                                      
            setattr(instance, p, 0)                                                                                                                   
        return instance                                                                                                                               

class MyFoo(Foo):                                                                                                                                     
    properties = ['bar', 'baz']                                                                                                                       

    def __init__(self):                                                                                                                               
        pass                                                                                                                                          



f=MyFoo()                                                                                                                                             
print dir(f)   
所需的属性直接初始化为零。你可以做很多聪明的事情,比如动态地做属性列表。所有实例化的对象都将具有这些方法。这种模式的一个更复杂的例子出现在中,在这里,由于元类的存在,您可以免费声明字段并获得许多自动内容

从磁盘反序列化

假设您有一个具有给定构造函数的类,该构造函数从对象(如进程)填充该类的字段:

class ProcessWrapper(object):                                                                                                                         
    def __init__(self, process):                                                                                                                      
        self._process_pid = process.pid()                                                                                                             

    def processPid(self):                                                                                                                             
        return self._process_pid           
如果现在将此信息序列化到磁盘并希望恢复它,则无法通过构造函数进行初始化。因此,您可以编写这样的反序列化函数,有效地绕过无法运行的
\uuuu init\uuuu
方法

def deserializeProcessWrapperFromFile(filename):                                                                                                      
    # Get process pid from file                                                                                                                       
    process = ProcessWrapper.__new__()                                                                                                                
    process._process_pid = process_pid                                                                                                                
    return process         

你基本上是在这里要求一份清单;示例显示如何使用
\uuuuu new\uuuuu
。这使得这个问题主要基于观点,过于宽泛,最重要的是,脱离了主题。因此,我投票决定关闭它。@MartijnPieters,请教育我。我写道,我对如何使用它不感兴趣,但你评论说我对如何使用它感兴趣。因为我不知道,所以每个人都理解理论和实践之间的区别的英语短语是什么?非常感谢。对于第二部分,我没有问你关于使用X是好是坏的看法,我问的是事实(例如:“Python用于web开发”,这是事实,不管谁怎么想)。@Martijn这不是基于观点的。这是一个很好的技术问题的设计背景植根于新的建设。这实际上是一个非常好的例子question@Stefano我同意Martijn的观点-这仍然是离题的/太宽泛了。它要求列出使用
\uuuuu new\uuuuu
的位置。。。答案是它在各种各样的地方被用来做各种各样的事情。如果这是其中一种方法的实际使用中的一个具体问题,那么它将是不同的,它将是关于主题的。@greenoldman这就是太宽泛的全部观点。。。没有一个真正的答案可以解决你的特定问题,因为你没有特定的问题。SO Q&A引擎不适合构建列表。。。有一些老问题是出于历史目的保留下来的,它们实际上是列表,但这些天都不在讨论这个话题。非常感谢。如果我没有弄错的话,这两种情况都是因为您不能在
\uuuuu init\uuuuuuu
中更改对象属性——删除此限制(例如C#
readonly
字段不仅可以在声明时直接写入,还可以在构造函数中写入)它将在没有作业的情况下呈现
\uuuuuu init\uuuuuuuu
,对吗?