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你不必担心它的正确性。

``

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
JavaCenter是JavaFX2中不可执行的窗格   java Docker将容器连接到本地数据库   java无法通过Spring从Redis获得正确的值   java为什么要将数组转换为列表再转换为数组   Java泛型在方法中放入字符串或整数参数   在Cloud Bigtable SDK中找不到java类   java Mavensiteplugin无法加载生成的源(Jaxb)   java GWT序列化和Appengine通道Api   PrintWriter out=new PrintWriter(sWriter)和PrintWriter out=response之间的java差异。getWriter()   空手道DSL中的javascript,在java参数调用中传递变量时如何转义单引号   windows 64位java可以与32位tomcat一起使用   为for循环| Java输入参数   java您可以更改SWT选项卡项的背景和/或前景颜色吗?   用java生成6位pin码   java如何从另一个通量中排除通量中的所有元素   java无法调用“javafx.scene.control.ComboBox.getItems()”,因为“Controller.getMyBox()”的返回值为null   将Java字符串与数组匹配时出现问题   java如何使用HttpsUrlConnection对SSL连接使用代理身份验证?   java如何检查XML元素是否包含CDATA?