Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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 如何命名_uinit_uu用于确定新对象值的方法?_Python_Python 3.x_Casting_Type Conversion - Fatal编程技术网

Python 如何命名_uinit_uu用于确定新对象值的方法?

Python 如何命名_uinit_uu用于确定新对象值的方法?,python,python-3.x,casting,type-conversion,Python,Python 3.x,Casting,Type Conversion,我是Python新手,几天前开始学习Python 3.3 让我们有两个类,Source和DestDest在Source之前声明 我想创建一个属于classDest的对象,其内容根据属于classSource的对象 代码> >代码> >:源代码:>代码>操作符Distor(源代码)< /C>,代码> > Dist::Dist[源代码] < />代码>代码>操作符Distor(源代码)>代码> >代码> >: 我考虑装饰Dest的\uuuu init\uuuu以将Dest对象的值设置在传递的参数的特

我是Python新手,几天前开始学习Python 3.3

让我们有两个类,
Source
Dest
Dest
Source
之前声明

我想创建一个属于class
Dest
的对象,其内容根据属于class
Source
的对象

<如果是C++(我知道的很好),那么我就可以通过编写<代码>源代码:>代码> >代码> >:源代码:>代码>操作符Distor(源代码)< /C>,代码> > Dist::Dist[源代码] < />代码>代码>操作符Distor(源代码)>代码> >代码> >: 我考虑装饰
Dest
\uuuu init\uuuu
以将
Dest
对象的值设置在传递的参数的特殊方法返回的值上(如果存在),该方法应返回具有类似于
Dest
对象属性的对象

在代码中,它可能是这样的:

def allow_conversion(prev_init, special_method_name):
    def wrap(self, source, *args, **dic):
        try:
            #call getattr(source, special_method_name)(*args, **dic)
            #copy attributes of returned object (don't know how to implement)
        except Exception: #if getattr(source, special_method_name)
            pass          #doesn't exist or raised Exception
        finally:
            prev_init(source, *args, **dic) #original __init__ is always called
    return wrap

class Dest:
    @allow_conversion('special_method')
    def __init__(self):
        pass #do some initializing

我想知道如何命名这个特殊的方法。有什么习惯吗?

如果我正确理解您的问题,您只需使用
源代码的实例创建
Dest
的实例即可。为此,您应该在
Dest
中定义一个类方法,它将
Source
的实例作为参数,并返回正确初始化的
Dest
实例

class Source:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class Dest:
    def __init__(self, a):
        self.a = a

    @classmethod
    def from_source(cls, src):
        return Dest(src.x + src.y)


s = Source(5, 3)
d = Dest.from_source(s)
assert d.a == 8

Source
实例“转换”为
Dest
实例的所有逻辑都将驻留在
Dest中。from\u Source

Python使用“duck typing”,这意味着如果调用方需要一个对象作为方法,则可以使用它。它不做静态输入。所以,你不需要“投”。你能用python代码举一个简短的例子说明你想完成什么吗?当
Dest
Source
之前声明时,我可以简单地在
Source
类的定义中添加
Dest.from\u Source
方法。不,先定义哪个类并不重要,只要在定义这两个类之前不尝试从源调用Dest.from\u source
。从技术上讲,源代码的
根本不要求
src
是源代码的实例;它只需要
src
就可以有两个属性
x
y
,可以一起添加。这就是duck类型的意思。我的意思是:当
Dest
在任何人考虑
Source
之前就定义好了,所以
Dest.from\u Source
在定义
Dest
时就没有定义。噢。嗯,有点。从一个类的定义中修补另一个类有点奇怪。我可以将
from\u source
定义为
source
之外的常规函数,然后使用
Dest.from\u source=classmethod(from\u source)
来修补
Dest
类。或者您可能会将事情颠倒一点:是否必须将该方法添加到
Dest
,或者是否可以在
Source
中定义一个
to_Dest()
方法,该方法返回
Dest
的实例。这样做的好处是作为常规实例方法,因此您可以编写类似于
d=Source(3,5).to_dest()
的代码。