学习使我快乐

鸭子类型和多态

当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。

例如下面三个类(Cat、Dog、Duck)的定义中都定义了say方法

class Cat:

def say(self):

print("I am a cat!")

class Dog:

def say(self):

print("I am a dog! ")

class Duck:

def say(self):

print("I am a duck! ")

我们就可以如下面的方法,使用这三个类的定义。

animals = [Cat, Dog, Duck]

for Animal in animals:

Animal().say();

复制代码

要在Java、C++那些静态语言中,要实现上述效果,通常要使用如下的多态机制。

class Animal:

def say(self):

print("I am a animal!")

class Cat(Animal):

def say(self):

print("I am a cat!")

a_animal = Cat()

a_animal.say() # 多态

扩展:列表的extend方法传递可迭代的对象即可,它会调用getitem方法

抽象基类 (abc模块)

首先看看如下定义:

class Company:

def init(self, employee_list):

self.employee = employee_list

def len(self):

return len(self.employee)

com = Company(["bobby1", "bobby2"])

抽象基类通常有以下几个优点:

判断类型

我们要判定某个类型是否是“某个鸭子”,通常有如下两种方法。

print(hasattr(com, "len"))

print(isinstance(com, Company)) # 这种方式更好

扩展:abc模块collections.abc,和全局abc

强制某个子类必须实现某些方法

例如要实现了一个web框架, 集成Cache(redis、cache、、),需要设计一个抽象基类, 指定子类必须实现某些方法

from abc import abstractmethod

class Cache:

@abstractmethod

def get(self, key):

pass

@abstractmethod

def set(self, key, value):

pass

class RedisCache(Cache):

def get(self, key):

pass

def set(self, key, value):

pass

redis = RedisCache()

redis.set("key", "value")

扩展:isinstance和type的区别 首先看看如下定义:

class A:

pass

class B(A): #A、B可以看成是模板对象,全局只有一个

pass

b = B()

print(isinstance(b, A)) #True

python中的is是判断两个对象的地址是否一样,==是判断两个对象的内容是否一样。

print(type(b) is B) #判断地址是否相同 True

print(type(b) == B) #判断值是否相同 True

print(type(b) is A) #False

类变量和实例变量

class A:

aa = 1

def init(self, x, y):

self.x = x

self.y = y

a = A(2, 3)

A.aa = 11

a.aa = 100 # 添加新的属性到a对象上

print(a.x, a.y, a.aa) # 100

print(A.aa) # 11

print(A.x) #抛异常

b = A(4, 6)

print(b.aa)

类和实例属性的查找顺序—mro查找

多继承子类属性的查找问题,如下所述,采用广度和深度搜索都是有问题的。 父类 子类 D---->B---->A E---->C---->A

DFS: A->B->D->C->E BFS: A->B->C->D->E, 如果D和C有重名方法,C会覆盖D

菱形继承 D---->B---->A D---->C---->A

DFS: A->B->D->C, C的方法无法覆盖D的方法 BFS: A-->B->C->D

python采用一种C3的算法查找属性和函数。

class D:

pass

class C(D):

pass

class B(D):

pass

class A(B, C):

pass

print(A.mro) # 获取查询顺序

类方法、静态方法和实例方法

class Date:

#构造函数

def init(self, year, month, day):

self.year = year

self.month = month

self.day = day

def tomorrow(self): #实例方法

self.day += 1

@staticmethod # 不需要cls类型的信息

def vaild_str(date_str):

year, month, day = tuple(date_str.split("-"))

if int(year) > 0 and int(month) > 0 and int(month) <= 12 and int(day) > 0 and int(day) <= 31:

return True

else:

return False

@staticmethod

def parse_from_string(date_str): #静态方法

year, month, day = tuple(date_str.split("-"))

return Date(year, month, day)

@classmethod

def parse_from(cls, date_str): #类方法

year, month, day = tuple(date_str.split("-"))

return cls(year, month, day) #cls不用硬编码了

def __str__(self):

return "{year}/{month}/{day}".format(year=self.year, month=self.month, day=self.day)

扩展:元组是可以拆包的

date_str = "2018-12-31"

year, month, day = tuple(date_str.split("-"))

数据封装和私有属性

class User: def init(self, birthday): self.__birthday = birthday

def age(self):

return 2020 - self.__birthday.year

user = User(Date(1990, 2, 1))

print(user.__birthday) #报错,到达私有目的, 子类也没办法获取

print(user._User__birthday) #变形规则 print(user.age())

class Student(User): def init(self, birthday): self.__birthday = birthday

stu = Student(Date(1995, 4, 1))

print(stu._Student__birthday)

python对象的自省机制

自省是通过一定的机制查询到对象的内部结构

class Person: """ 人 """ name = "person"

class Student(Person): def init(self, school): self.school = school

stu = Student("慕课网") print(stu.dict) print(stu.name) # name属于Person类 print(Person.dict)

stu.dict["addr"] = "北京市" print(stu.addr) print(dir(stu)) # 列出对象所有属性

4-10 super真的是调用父类吗?

class A: def init(self): print("A")

class B(A): def init(self): print("B") super().init()

class C(A): def init(self): print("C") super().init()

class D(B, C): def init(self): print("D") super().init() b = B() print("-------------------") d = D() #按MRO算法 super调用顺序 from threading import Thread

class MyThread(Thread): def init(self, name, user): self.user = user super().init(name=name) # MRO算法

mixin继承案例

python中的with语句

try except finally

try: print("code started") raise KeyError # raise IndexError except KeyError as e: print("key error") else: print("other error") finally: print("finally...")

上下文管理器(协议)

class Sample: def enter(self): print("enter") return self

def exit(self, exc_type, exc_val, exc_tb):

print("exit")

def do_something(self):

print("doing something.....")

with Sample() as sample: sample.do_something()

from contextlib import contextmanager

@contextmanager def openFile(file): print("file open....") yield {} print("file close....")

print("-------------") with openFile("hao.txt"): print("file processing...")

python编程高手教程_写给编程高手的Python教程(11) 深入类和对象相关推荐

  1. python语言的开发者_写给.NET开发者的Python教程(一):引言

    距离上一篇博文已过去8个月了,这段时间发生了很多事情导致没能持续更新博客.这段时间除了工作繁忙,业余时间都投入到AI技术的学习中,后面一段时间将会给大家分享我作为一个.NET开发人员在深度学习领域学习 ...

  2. python编程高手教程_写给编程高手的Python教程(01) 数据结构

    如何在列表,字典,集合中根据条件筛选数据 案例:如何在下列列表data中筛选出大于0的数 data = [1, -1, 2, 3, 4, 7] 复制代码 使用filter函数,第一个参数为一个函数,也 ...

  3. ZBrush教程_次时代作品“行尸矿工”制作教程

    ZBrush教程_次时代作品"行尸矿工"制作教程 链接:https://pan.baidu.com/s/12BcANjJC_Q8SLgqTf2dyjw 密码:hd0c 这是在我工作 ...

  4. python免费课程400节-少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

    大家好,我是爱编程的小熊,上一节我们学习了图形的旋转,这节,我们继续学习图形旋转及其变化的轨迹,进而绘制出更加绚丽的图案.编程描述:这一节 我们将在上几节所学的基础内容,并加上色彩和渐变填充的效果,画 ...

  5. python在线编程免费课程-少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

    大家好,我是爱编程的小熊,上一节我们学习了图形的旋转,这节,我们继续学习图形旋转及其变化的轨迹,进而绘制出更加绚丽的图案.编程描述:这一节 我们将在上几节所学的基础内容,并加上色彩和渐变填充的效果,画 ...

  6. python编程资料包_强力推荐,非常全的Python编程400集学习资料(今日限免)

    因为大数据和 AI,Python 一跃成为最火的语言,这里推荐几本畅销排行榜上的好书. 有需要在我的哔哩哔哩账号,私信我,"资料,即可免费领取. 一.Python基础教程 <图灵程序设 ...

  7. python计算矩形周长_一边学编程,一边学语数外,用python编程学三年级周长计算...

    原标题:一边学编程,一边学语数外,用python编程学三年级周长计算 编程并不神秘 编程只是解决问题的一共方法 python是一门编程语言 python是一种解决问题的编程工具 在小学阶段,学习编程的 ...

  8. 派森编程软件python有什么用_派森下载-《派森》(Python)下载3.6.5 win32 英文安装版-西西软件下载...

    Python是一种面向对象.直译式计算机程序设计语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务.它的语法非 ...

  9. python一级考试题目_全国青少年软件编程(Python)等级考试试卷(一级)br测试卷-20191114123907422...

    全国青少年软件编程 ( Python ) 等级考试试卷 (一 级) 测试卷 分数: 100.00 题数: 50 一.单选题 (共 30 题,每题 2 分,共 60 分) 1. 关于 Python 的编 ...

最新文章

  1. 地球5000年变化全景动画——看完叹了口气:整个世界安静了
  2. element-ui 表格table,动态显示每一列的,重置全选
  3. 没有到主机的路由_网络基础知识:UDP协议之路由跟踪
  4. 转换实体类_yue-library 2.3.0发布,替换Db JavaBean转换方案,性能提升约300%+
  5. mysql中数据库覆盖导入的几种方式
  6. 让服务器突破性能极限 阿里云神龙论文入选计算机顶会ASPLOS
  7. No monitoring data is available
  8. TiDB 在 Ping++ 金融聚合支付业务中的实践
  9. 一个WIFI热点的脚本思路,顺记shell知识
  10. 讲述MPLS技术及其标准化进展
  11. Clean Code 笔记
  12. excel批量删除公式保留数据_Excel公式大批量输入,这几个技巧你一定不能错过...
  13. k3note Android8,价格只差100 乐檬K3 Note对比红米Note
  14. 无基础如何备考软考软件设计师?
  15. 分页 在mybatis执行SQL语句之前进行拦击处理实例
  16. 【外卖点餐平台项目遇到的问题】
  17. Java类和对象之对象引用之模拟手机功能
  18. java1.8安装及环境变量配置详细教程(专业保姆级,秒会)
  19. 数据结构(Java)
  20. 全球首个华纳兄弟酒店正式营业,《老友记》喷泉、全新蝙蝠侠战车亮相

热门文章

  1. SQL*Loader 笔记 (一) 热身练习
  2. 大数据搜索选开源还是商业软件?ElasticSearch 对比 Splunk
  3. NGUI: UIPanel控件
  4. ORA-14400: inserted partition key does not map to any partition
  5. windows系统共享文件夹访问无需验证(输入用户名和密码)即可进入
  6. jmeter 测试websocket接口(一)
  7. 构建之法4、17章观后感
  8. Nagios基本搭建
  9. 合并多个文本文件方法
  10. CSS3圆圈动画放大缩小循环动画效果