• python 的面相对象编程--对应c++


      在python的面相对象编程中,我们常常在class中可以看到a(),  _b() ,  __c(), __d()__这样的函数。

      由于我是看廖雪峰老师的教程,廖老师为了简单起见,没有引入太多概念,我在学习c++的过程中,发现c++对应的概念如下:

     (1) 访问限制

      在c++, java中,我们可以看到public, pretected, private这样的访问修饰符:

      a() 对应public,可以通过 实例.a() 这种外部方式使用,也可以在本类和派生类中使用;

      _b() 对应protected, 只能在本类和派生类中使用;

      __c() 对应 private, 只能在本类中使用

    (2)__d()__魔术 实现解构/析构与 重载运算符

      在python中,__d()__是python的魔术方法,我们可以利用它解构/析构,与重载运算符,看下面的函数名称你就会明白

    方法名

    重载说明

    运算符调用方式

    __init__

    构造函数

    对象创建: X = Class(args)

    __del__

    析构函数

    X对象收回

    __add__/__sub__

    加减运算

     X+Y, X+=Y/X-Y, X-=Y

    __or__

    运算符|

    X|Y, X|=Y

    _repr__/__str__

    打印/转换

    print(X)、repr(X)/str(X)

    __call__

    函数调用

    X(*args, **kwargs)

    __getattr__

    属性引用

    X.undefined

    __setattr__

    属性赋值

    X.any=value

    __delattr__

    属性删除

    del X.any

    __getattribute__

    属性获取

    X.any

    __getitem__

    索引运算

    X[key],X[i:j]

    __setitem__

    索引赋值

    X[key],X[i:j]=sequence

    __delitem__

    索引和分片删除

    del X[key],del X[i:j]

    __len__

    长度

    len(X)

    __bool__

    布尔测试

    bool(X)

    __lt__, __gt__, 

    __le__, __ge__, 

    __eq__, __ne__

    特定的比较

    依次为X<Y,X>Y,X<=Y,X>=Y, 

    X==Y,X!=Y 

    注释:(lt: less than, gt: greater than, 

      le: less equal, ge: greater equal, 

      eq: equal, ne: not equal 

    __radd__

    右侧加法

    other+X

    __iadd__

    实地(增强的)加法

    X+=Y(or else __add__)

    __iter__, __next__

    迭代

    I=iter(X), next()

    __contains__

    成员关系测试

    item in X(X为任何可迭代对象)

    __index__

    整数值

    hex(X), bin(X),  oct(X)

    __enter__, __exit__

    环境管理器

    with obj as var:

    __get__, __set__, 

    __delete__

    描述符属性

    X.attr, X.attr=value, del X.attr

    __new__

    创建

    在__init__之前创建对象

    (3)@staticmethod 装饰器与 静态方法的实现:

      在c++中,我们可以通过static修饰符,来使public下的函数可以通过classname::funcname();的方式访问,而无需实例化。

      对应的@staticmethod 就是干这个的,于是,我们就可以使用classname::funcname()的方式访问,而无需实例化。

      

    (4)@classmethod装饰器与@staticmethod的异同

      首先要讲的是,二者使用的相同之处,就是都是通过classname::funcname()的方式访问

      @classmethod 装饰的是类方法,@staticmethod 装饰的是 静态方法。

      @staticmethod 装饰的静态方法,就是单纯的想将一个函数绑在类上,让他继承下去。

      @classmethod 装饰的类方法,传递参数给类,多用于对类的预处理。

      详情请看下面大神教程,不在累述。

      http://python.jobbole.com/81595/

    (5)@abc.abstractmethod 装饰器对 抽象类的实现

      我们有时候需要在基定义一个纯虚函数,强制让派生类重新实现一次,我们就可以使用abc包的@abc.abstractmethod 装饰器实现。

      详情请看下面大神教程,不在累述。

      http://python.jobbole.com/81595/

    -------------------------------------

    小生python, c++菜鸟,如有描述错误,欢迎大家指正!

     

      

  • 相关阅读:
    Redis集群启动脚本
    查看表结构
    MySQL删除冗余数据
    Java中的阶乘
    MySQL中IFNULL,ISNULL和NULLIF
    最小化安装CentOS7后要做的30件事情
    VMware的CentOS部署环境
    CentOS 上的 FirewallD 简明指南
    CentOS安装Java环境
    Linux中一些常用的很巧妙的命令
  • 原文地址:https://www.cnblogs.com/chenyansu/p/8356300.html
Copyright © 2020-2023  润新知