• 面向对象进阶


    继承

    继承是面向对象程序设计的重要特征,也是实现“代码复用”的重要手段。 如果一个新类继承自一个设计好的类,就直接具备了已有类的特征,就大大降低了工作 难度。已有的类,我们称为“父类或者基类”,新的类,我们称为“子类或者派生类”。

    语法格式
    Python 支持多重继承,一个子类可以继承多个父类。继承的语法格式如下:

     class 子类类名(父类 1[,父类 2...]):
      	类体 

    如果在类定义中没有指定父类,则默认父类是 object 类。也就是说,object 是所有类的父 类,里面定义了一些所有类共有的默认实现,比如:new()。 定义子类时,必须在其构造函数中调用父类的构造函数。调用格式如下: 父类名.init(self, 参数列表)

    class Person: 
    	def __init__(self,name,age): 
    		self.name = name
    		self.__age = age
    	
    	def say_age(self): 
    		print(self.name,"的年龄是:",self.__age)
    
    
    class Student(Person): 
    	def __init__(self,name,age,score): 
    		self.score = score 
    		Person.__init__(self,name,age) #构造函数中包含调用父类构 造函数。根据需要,不是必须。 子类并不会自动调用父类的__init__(),我 们必须显式的调用它。 
    
    s1 = Student("张三",15,85) 
    s1.say_age() 
    print(dir(s1)) 

    运行结果:

    张三 的年龄是: 15 ['_Person__age', '__class__', '__delattr__', '__dict__',
    '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
    '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
    '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
    'name', 'say_age', 'score'] 

    类成员的继承和重写

    1. 成员继承:子类继承了父类除构造方法之外的所有成员。
    2. 方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为“重写

    object 根类
    object 类是所有类的父类,因此所有的类都有 object 类的属性和方法。
    dir()查看对象属性
    重写__str__()方法
    object 有一个__str__()方法,用于返回一个对于“对象的描述”,对应于内置函数 str() 经常用于 print()方法,帮助我们查看对象的信息。str()可以重写。
    super()获得父类定义 在子类中,如果想要获得父类的方法时,我们可以通过 super()来做。

    多态

    多态(polymorphism)是指同一个方法调用由于对象不同可能会产生不同的行为。在现实 生活中,我们有很多例子。比如:同样是调用人的休息方法,张三的休息是睡觉,李四的休 息是玩游戏,高淇老师是敲代码。同样是吃饭的方法,中国人用筷子吃饭,英国人用刀叉吃 饭,印度人用手吃饭。 关于多态要注意以下 2 点: 1. 多态是方法的多态,属性没有多态。 2. 多态的存在有 2 个必要条件:继承、方法重写。

    特殊方法和运算符重载

    常见的特殊方法统计如下:

    方法说明例子
    init构造方法对象创建:p = Person()
    del析构方法对象回收
    repr,str打印,转换print(a)
    call函数调用a()
    getattr点号运算a.xxx
    setattr属性赋值a.xxx = value
    getitem索引运算a[key]
    setitem索引赋值a[key]=value
    len长度len(a)

    每个运算符实际上都对应了相应的方法,统计如下:

    运算符特殊方法说明
    运算符+add加法
    运算符-sub减法
    <,<=,==lt,leeq比较运算符
    >,>=,!=gt_,ge,ne比较运算符
    _,^,&or,xor,and
    <<,>>lshift,rshift左移、右移
    *,/,%,//mul,truediv,mod,_ floordiv_乘、浮点除、模运算 (取余)、整数除
    **pow指数运算

    特殊属性

    Python 对象中包含了很多双下划线开始和结束的属性,这些是特殊属性,有特殊用法。这 里我们列出常见的特殊属性:

    特殊方法含义
    obj.dict对象的属性字典
    obj.class对象所属的类
    class.bases类的基类元组(多继承)
    class.base类的基类
    class.mro类层次结构
    class.subclasses()子类列表

    对象的浅拷贝和深拷贝

    变量的赋值操作 只是形成两个变量,实际还是指向同一个对象。 ·浅拷贝Python 拷贝一般都是浅拷贝。拷贝时,对象包含的子对象内容不拷贝。因此,源对象 和拷贝对象会引用同一个子对象。 ·深拷贝使用 copy 模块的 deepcopy 函数,递归拷贝对象中包含的子对象。源对象和拷贝对象 所有的子对象也不同。
    组合“is-a”关系,我们可以使用“继承”。从而实现子类拥有的父类的方法和属性。“is-a” 关系指的是类似这样的关系:狗是动物,dog is animal。狗类就应该继承动物类。 “has-a”关系,我们可以使用“组合”,也能实现一个类拥有另一个类的方法和属性。” has-a”关系指的是这样的关系:手机拥有 CPU。 MobilePhone has a CPU。
    设计模式_单例模式实现
    单例模式(Singleton Pattern)的核心作用是确保一个类只有一个实例,并且提供一 个访问该实例的全局访问点。 单例模式只生成一个实例对象,减少了对系统资源的开销。当一个对象的产生需要比较 多的资源,如读取配置文件、产生其他依赖对象时,可以产生一个“单例对象”,然后永久 驻留内存中,从而极大的降低开销。

    Python 文档字符串(DocStrings)

    DocStrings 文档字符串是一个重要工具,用于解释文档程序,帮助你的程序文档更加简单易懂。
    我们可以在函数体的第一行使用一对三个单引号 ‘’’ 或者一对三个双引号 “”" 来定义文档字符串。
    你可以使用 doc(注意双下划线)调用函数中的文档字符串属性。

    def function():
            ''' say something here!
            '''
            pass
     
    print (function.__doc__) # 调用 doc

    输出结果为:

     say something here!
    别废话,拿你代码给我看。
  • 相关阅读:
    [BJOI2016] 回转寿司
    [洛谷P4115] Qtree4 & [ZJOI2007] 捉迷藏
    [POI2011] METMeteors
    [NOI2020] 命运
    [20220404联考] 条条下水道通祖安
    相机丢图解决方案
    网卡一些设置,摘自百度文库
    设置 Qtabwidget 窗体透明
    DevExpress RibbonControl菜单组底部怎么去掉 学无止境
    Python篇:某宝毫秒级的精准秒杀
  • 原文地址:https://www.cnblogs.com/lvxueyang/p/13707520.html
Copyright © 2020-2023  润新知