python类的特殊多态性!
polymorphism的Python项目详细描述
…highlight::python
python类的特殊多态性!
=
=
安装
安装
---------
:
=
===============
=======
===================================================================/>
从多态导入多态
类简单(多态):
def calc(self,x:int,y:int)->;无:
pass
def calc(self,x:float,y:float)->;无:
pass
r/>从多态导入polymorphismmeta
类简单(元类=polymorphismmeta):
…
有时不希望向继承中添加另一个类,则可以使用"overload"修饰符::
r/>
类简单(多态):
@重载
定义计算(self,x:int,y:int)->;无:
通过
@calc.重载
定义计算(self,x:float,y:float)->;无:
通过
rator并继承它是在检查方法着色。对于"overload",下一个示例不会引发异常:
``只会是属性。
为什么?
----
实现多态性的想法并不新鲜。许多库实现了这个想法。甚至"标准库"http://docs.python.org/3.4/library/functools.html"functools.singledispatch"也有一个实现。
食谱第三版<;http://shop.oreilly.com/product/0636920027072.do>;``作者:戴维·比兹利和布赖恩·琼斯。但是书中的实现不支持使用关键字参数!
优点
——
*使用标准和自定义描述符
*使用命名(关键字)参数
*检查:
*可变长度的参数
*遗漏的参数注释
*描述符的包装函数的名称
*按属性或数据的着色方法ta描述符(类似于``property``)
*用相同的类型重新定义方法
*例如,使用任何名称,不仅对所有检查都会引发``self`
*异常。
限制
--
*用于分派的简单类型
*``overload``sh应该是decorators的顶部
*自定义描述符应该将包装函数保存在"\uuu wrapped\uu"名称下
*显然,方法参数不能是可变长度(\*和\*\*)
比较命名约定。
例如::
class simple(多态):
def calc(self,x:int,y:int)->;none:
pass
@classmethod
def calc(cls,x:float,y:float)->;none:
pass
@staticmethod
def calc(x:str,y:str)->;无:
pass
simple()。calc(1.0,y=2.0)
通过
@calc.overload
@classmethod
def calc_float(cls,x:float,y:float)->;无:
pass
@calc.overload
@staticmethod
def calc_str(x:str,y:str)->;无:
pass
with``overload``只有第一个方法名才重要。其他方法可以有任何其他名称。
``多态性``在创建时检查类:
def calc(self,x:int,y:int)->;无:
pass
def calc(self,x:int,y:int,z:int=3)->;无:
pass
上面的示例将引发"typeerror"异常,因为"calc"方法使用默认值的"z"参数重载,并且不可能将最后一个方法与第一个方法区分开来。
"多态性"将在任何错误重载时引发"typeerror"异常,因此y你不必担心它的正确性。
``
python类的特殊多态性!
=
=
安装
安装
---------
:
=
===============
=======
===================================================================/>
从多态导入多态
类简单(多态):
def calc(self,x:int,y:int)->;无:
pass
def calc(self,x:float,y:float)->;无:
pass
r/>从多态导入polymorphismmeta
类简单(元类=polymorphismmeta):
…
有时不希望向继承中添加另一个类,则可以使用"overload"修饰符::
r/>
类简单(多态):
@重载
定义计算(self,x:int,y:int)->;无:
通过
@calc.重载
定义计算(self,x:float,y:float)->;无:
通过
rator并继承它是在检查方法着色。对于"overload",下一个示例不会引发异常:
``只会是属性。
为什么?
----
实现多态性的想法并不新鲜。许多库实现了这个想法。甚至"标准库"http://docs.python.org/3.4/library/functools.html"functools.singledispatch"也有一个实现。
食谱第三版<;http://shop.oreilly.com/product/0636920027072.do>;``作者:戴维·比兹利和布赖恩·琼斯。但是书中的实现不支持使用关键字参数!
优点
——
*使用标准和自定义描述符
*使用命名(关键字)参数
*检查:
*可变长度的参数
*遗漏的参数注释
*描述符的包装函数的名称
*按属性或数据的着色方法ta描述符(类似于``property``)
*用相同的类型重新定义方法
*例如,使用任何名称,不仅对所有检查都会引发``self`
*异常。
限制
--
*用于分派的简单类型
*``overload``sh应该是decorators的顶部
*自定义描述符应该将包装函数保存在"\uuu wrapped\uu"名称下
*显然,方法参数不能是可变长度(\*和\*\*)
比较命名约定。
例如::
class simple(多态):
def calc(self,x:int,y:int)->;none:
pass
@classmethod
def calc(cls,x:float,y:float)->;none:
pass
@staticmethod
def calc(x:str,y:str)->;无:
pass
simple()。calc(1.0,y=2.0)
通过
@calc.overload
@classmethod
def calc_float(cls,x:float,y:float)->;无:
pass
@calc.overload
@staticmethod
def calc_str(x:str,y:str)->;无:
pass
with``overload``只有第一个方法名才重要。其他方法可以有任何其他名称。
``多态性``在创建时检查类:
pass
def calc(self,x:int,y:int,z:int=3)->;无:
pass
上面的示例将引发"typeerror"异常,因为"calc"方法使用默认值的"z"参数重载,并且不可能将最后一个方法与第一个方法区分开来。
"多态性"将在任何错误重载时引发"typeerror"异常,因此y你不必担心它的正确性。
``