Python第八周 学习笔记(1)

继承


  • 基本概念个体继承自父母,继承了父母的一部分特征,但也可以有自己的个性
  • 子类继承了父类,就直接拥有了父类的属性和方法,也可以定义自己的属性、方法,甚至对父类的属性、方法进行重写

Python继承实现

  • class Cat(Animal) 括号中为该类的父类列表

  • 如果类定义时没有父类列表,则只继承object类
  • object类是所有类的祖先类

类的特殊属性与方法

  • base

    • 类的基类
  • bases
    • 类的基类的元组
  • mro
    • 方法解析时的类的查找顺序,返回元组
  • mro()
    • 作用同上,返回列表
  • subclasses()
    • 返回类的子类的列表

Python继承中的注意事项

  • 属于父类的私有成员,子类即使与父类存在继承关系也不可直接访问(可通过改名后的属性名访问,但慎用)
  • 例子:

class Animal:
    __count=100
    heigtht=0

    def showcount3(self):
        print(self.__count)

class Cat(Animal):
    name=‘cat‘
    __count=200

c=Cat()
c.showcount3()

结果为100

因为子类调用了父类获取父类私有变量的方法 self.count的count作用域是在父类下的,其真正调用的self._Animal__count,而这个属性只有父类有

  • 解决的办法:自己私有的属性,用自己的方法读取和修改,不要借助其他类的方法,即使是父类或派生类的方法

属性查找顺序

  • 实例dict -> 类dict -> 父类dict

多继承

Mixin

  • 本质是多继承
  • 体现的是一种组合的设计模式

Mixin类使用原则

  • 类中不应该显示的出现init初始化方法
  • 通常不能独立工作,因为它是准备混入别的类中的部分功能实现
    其祖先类也应是Mixin类
  • 使用Mixin时,其通常在继承列表的第一个位置
  • 装饰器实现

def printable(cls):
    def _print(self):
        print(self.content, ‘decorator‘)

    cls.print = _print
    return cls

class Document:
    def __init__(self, content):
        self.content = content

class Word(Document):
    pass

class Pdf(Document):
    pass

@printable
class PrintableWord(Word): pass

print(PrintableWord.__dict__)
print(PrintableWord.mro())

pw = PrintableWord(‘test string‘)
pw.print()

@printable
class PrintablePdf(Word):
    pass
  • 优点:

    • 简单方便,在需要的地方动态增加,直接使用装饰器

Mixin实现


class Document:
    def __init__(self, content):
        self.content = content

class Word(Document):
    pass

class Pdf(Document):
    pass

class PrintableMixin:
    def print(self):
        print(self.content, ‘Mixin‘)

class PrintableWord(PrintableMixin, Word):
    pass

print(PrintableWord.__dict__)
print(PrintableWord.mro())

pw = PrintableWord(‘test string‘)
pw.print()

class SuperPrintableMixin(PrintableMixin):
    def print(self):
        print(‘~‘ * 20)
        super().print()
        print(‘~‘ * 20)

class SuperPrintablePdf(SuperPrintableMixin, Pdf):
    pass

print(SuperPrintablePdf.__dict__)
print(SuperPrintablePdf.mro())

spp = SuperPrintablePdf(‘super print pdf‘)

spp.print()

Mixin类和装饰器

  • 这两种方式都可以使用,看个人喜好
  • 如果还需要继承就得使用Mixin类

原文地址:http://blog.51cto.com/11281400/2115683

时间: 2024-08-30 03:37:12

Python第八周 学习笔记(1)的相关文章

20165326 java第八周学习笔记

第八周学习笔记 知识点总结 1.进程与线程 进程:程序的一次动态执行过程 区别:进程和线程的区别? 进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元 同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器.堆栈.上下文),一个进行至少包括一个线程. Java的多线程机制.Java内置对多线程的支持.我们的计算机在任何给定说的时刻只能执行线程中的一个,Java虚拟机只是从一个线程迅速地切换到另一个线程. 当main方法中有其他线程时,JVM一直要等到Java应用程序中的

机电传动第八周学习笔记

在这周的课上,我们学习了PLC的基本原理和应用.我们可以使用编程语言来控制我们的机电系统,而不是像原来一样用复杂庞大的物理结构来实现我们需要的状态,其核心是用作数字控制的专用工业计算机,基础是顺序控制器. PLC分为整体式和模块式两种,两种形式其实都或多或少的体现出了现在装备生产中利用到的模块化设计理念.在阅读了老师下发的模块化设计理念的资料中,我看到了化整为零,合零为整,通过标准化的模块搭建出个性化的产品,这不得不说对我的启发很大,感觉这一定也是未来各行业发展理念中的主流,尤其是生产制造行业,

python第八周学习内容

1.socket网络编程 1.1概念: 网络套接字是跨计算机网络的连接的端点.今天,计算机之间的大多数通信都基于互联网协议;因此大多数网络套接字都是Internet套接字.更准确地说,套接字是一个句柄(抽象引用),本地程序可以将其传递给网络应用程序编程接口(API)以使用该连接,例如"在此套接字上发送此数据". 例如,发送"Hello,world!"通过TCP到地址为1.2.3.4的主机的端口80,可以获得一个套接字,将其连接到远程主机,发送字符串,然后关闭套接字.

Python第五周 学习笔记(1)

高阶函数 First Class Object 函数也是对象,可调用的对象 函数可以作为普通变量.参数.返回值等等 数学概念 y=g(f(x)) 在数学和计算机科学中,高阶函数应当是至少满足下面一个条件的函数 接受一个或多个函数作为参数 输出一个函数 内建高阶函数 sorted(iterable[, key][, reverse]) 排序 filter(function, iterable) --> filter object 过滤数据 map(func, *iterables) --> ma

Python第七周 学习笔记(2)

面向对象 类 class 抽象概念 是属性与方法的集合 对象/实例 instance/object 类的具体实现/实例化 属性 对象状态的抽象,用数据结构描述 操作/方法 对象行为的抽象,用操作名和实现该操作的方法来描述 一切皆对象 对象是数据和操作的封装 对象是独立的,但是对象之间可以互相作用 目前OOP是最接近人类认知的编程范式 OOP三要素 封装 组装:将数据和操作组装到一起 隐藏数据:对外只暴露一些接口,通过接口访问对象 继承 复用 少修改 OCP开闭原则 对扩展开放,对修改关闭 多态

信息安全系统设计基础第八周学习笔记

系统级I/O 前言:输入/输出是在主存和外部设备(如磁盘驱动器.终端和网络)之间拷贝数据的过程.输入操作时从I/O设备拷贝数据到主存,而输出操作时从主存拷贝数据到I/O设备. 10.1  Unix I/O 一个Unix文件就是一个m个字节的序列:B0,B1,B2,B3...Bk...Bm-1. 所有的I/O设备,如网络.磁盘盒终端,都被模型化为文件,而所有的输入和输出都被当做对相应的文件的读和写来执行.这是一种应用接口,成为Unix I/O. ①打开文件:一个应用程序通过要求内核打开相应地文件,

第八周学习笔记

SQL SELECT DISTINCT 语句 1.在表中,一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值. DISTINCT 关键词用于返回唯一不同的值.SQL SELECT DISTINCT 语法 SELECT DISTINCT column_name FROM table_name; 2.字符串拼接时若拼接的某一部分的取值为NULL,则拼接后的输出结果只会是NULL 拼接的前部分将被覆盖丢失. 例.C.No+C.Name+C.PrecourseNo 当C.Pr

Python第三周 学习笔记(1)

字典 key-value键值对的数据的集合 可变的.无序的.key不重复 初始化: d = dict() d = {} d = dict(**kwargs) 如:d = dict(a=1,b=2) dict(iterable, **kwarg) 使用可迭代对象和name=value对构造字典,不过可迭代对象的元素必须是一个二元结构 dict(mapping, **kwarg) dict.fromkeys(iterable, value) 字典元素的访问 d[key] 返回key对应的值value

Python第五周 学习笔记(2)

装饰器应用练习 一.实现一个cache装饰器,实现可过期被清除的功能 简化设计,函数的形参定义不包含可变位置参数.可变关键词参数和keyword-only参数 可以不考虑缓存满了之后的换出问题 1)原始 def cache(fn): import inspect local_cache = {} def wrapper(*args, **kwargs): sig = inspect.signature(fn) params = sig.parameters param_names = list(