Python 如何命名_uinit_uu用于确定新对象值的方法?
我是Python新手,几天前开始学习Python 3.3 让我们有两个类,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对象的值设置在传递的参数的特
Source
和Dest
Dest
在Source
之前声明
我想创建一个属于classDest
的对象,其内容根据属于classSource
的对象
<如果是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()
的代码。