当适配器已经是正确类型时忽略适配器创建
Ignore adapter creation when adaptee already of correct type
我有以下设置:
class Target(Base):
def __init__(name: str):
self.name = name
class Adapter(Target):
def __init__(self, adaptee: Base, name: str):
super().__init__(name=name)
self.adaptee = adaptee
def as_target(adaptee: Base, name: str):
if isinstance(adaptee, Target):
return adaptee
else:
return Adapter(adaptee, name)
我想知道我是否可以摆脱 as_target
函数,而是处理适配器创建的逻辑。
从语义上讲,它将具有以下含义:
class Adapter(Target):
def __init__(self, adaptee: Base, name: str):
if isinstance(adaptee, Target):
self = adaptee
else:
super().__init__(name=name)
self.adaptee = adaptee
我试过重写 __new__
但我没能成功。
class Base:
pass
class Target(Base):
def __init__(self, name: str):
self.name = name
def __repr__(self):
return "{}({})".format(type(self).__name__, repr(self.name))
class Adapter(Target):
def __new__(cls, adaptee: Base, name: str):
if isinstance(adaptee, Target):
return adaptee
else:
return super().__new__(cls)
def __init__(self, adaptee: Base, name: str):
super().__init__(name=name)
self.adaptee = adaptee
print(Adapter(Base(), "a")) # Adapter('a')
print(Adapter(Target("b"), "c")) # Target('b')
我有以下设置:
class Target(Base):
def __init__(name: str):
self.name = name
class Adapter(Target):
def __init__(self, adaptee: Base, name: str):
super().__init__(name=name)
self.adaptee = adaptee
def as_target(adaptee: Base, name: str):
if isinstance(adaptee, Target):
return adaptee
else:
return Adapter(adaptee, name)
我想知道我是否可以摆脱 as_target
函数,而是处理适配器创建的逻辑。
从语义上讲,它将具有以下含义:
class Adapter(Target):
def __init__(self, adaptee: Base, name: str):
if isinstance(adaptee, Target):
self = adaptee
else:
super().__init__(name=name)
self.adaptee = adaptee
我试过重写 __new__
但我没能成功。
class Base:
pass
class Target(Base):
def __init__(self, name: str):
self.name = name
def __repr__(self):
return "{}({})".format(type(self).__name__, repr(self.name))
class Adapter(Target):
def __new__(cls, adaptee: Base, name: str):
if isinstance(adaptee, Target):
return adaptee
else:
return super().__new__(cls)
def __init__(self, adaptee: Base, name: str):
super().__init__(name=name)
self.adaptee = adaptee
print(Adapter(Base(), "a")) # Adapter('a')
print(Adapter(Target("b"), "c")) # Target('b')