Python说文解字_杂谈04
1. 鸭子类型:
当你看到一只鸟走来像鸭子,游泳起来像鸭子,叫起来也像鸭子,他么他就可以叫做鸭子。任何可迭代的对象。一样的方法,可以用可迭代的话,就可以迭代的组合打印。__getitem__可以塞到任何的类中,跟鸭子类型一样,指定相同的方法名。魔法函数正是充分运用了鸭子类型,能够被本身调用。
class Cat(object):
def say(self):
print("i am a cat") class Dog(object):
def say(self):
print("i am a dog") def __getitem__(self, item):
return "bobby" class Duck(object):
def say(self):
print("i am a duck") animal_lst = [Cat,Dog,Duck]
for animal in animal_lst:
animal().say() class Company:
def __init__(self,employee_list):
self.employee = employee_list def __getitem__(self, item):
return self.employee[item] a = ["bobby1","bobby2"]
b = ["bobby2","bobby"]
name_tuple = ("bobby3","bobby4")
name_set = set()
name_set.add("bobby5")
name_set.add("bobby6")
# a.extend(b)
# a.extend(name_tuple)
company = Company(["a",[b],"c"])
a.extend(company)
print(a)
2. 抽象基类(abc模块):
abstract base class
可以当做接口。Py的抽象基类也不能实例化的。
变量在Py当中就是一个符号。可以指向任何对象。
Py信奉的是鸭子类型。把鸭子类型放在第一位。
# 我们去检查某个类是否具有某种方法。(应用场景一) class Company(object):
def __init__(self,employee_list):
self.employee = employee_list def __len__(self):
return len(self.employee) com = Company(['bobby1','bobby2'])
print(hasattr(com,"__len__"))
# 我们在某些情况之下希望判定某个对象的类型
from collections.abc import Sized
isinstance(com,Sized) # 我们需要强制某个子类必须去实现某些方法
# 实现了web框架,继承cache(redis,cache,memerycache)
# 需要设计一个抽象基类,执行子类必须实现某些方法 # 如何去模拟一个抽象基类
import abc
# metaclass=abc.ABCMeta
class CacheBase(metaclass=abc.ABCMeta):
@abc.abstractmethod
def get(self, key):
pass @abc.abstractmethod
def set(self, key, value):
pass class RediCache(CacheBase):
def set(self, key, value):
pass def get(self, key):
pass redis_cache = RediCache()
redis_cache.set("key","value")
记住:抽象的是基类:必须metaclass = abc.ABCMeta
记住:抽象基类后有abc.abstractmethod抽象方法,和,abcabstractpropery抽象属性。
记住:抽象基类的主要作用是“定义”接口。
记住:用的是import abc这个抽象基类,而不是from collections.abc import abc
记住:使用__subclasshook__后只要具体类定义了与抽象类相同的方法就认为是他的子类
import abc class A(object):
__metaclass__ = abc.ABCMeta @abc.abstractmethod
def say(self):
return 'say yeah' @classmethod
def __subclasshook__(cls, C):
if cls is A:
if any("say" in B.__dict__ for B in C.__mro__):
return True
return NotTmplementd class B(object):
def say(self):
return 'hello' print issubclass(B, A) # True
print isinstance(B(), A) # True
print B.__dict__ # {'say': <function say at 0x7f...>, ...}
print A.__subclasshook__(B) # True
__mro__ 表示多继承的顺序。
Python说文解字_杂谈04的更多相关文章
- Python说文解字_杂谈05
1. isinstance和type: is和==符号,is指的是内存地址,是不是一个对象,ID知否相同 集成链 class A: pass class B(A): pass b = B() prin ...
- Python说文解字_杂谈09
1. 元类编程代码分析: import numbers class Field: pass class IntField(Field): # 数据描述符: # 初始化 def __init__(sel ...
- Python说文解字_杂谈08
1. Python变量到底是什么? Python和Java中的变量本质不一样,python的变量实质是一个指针 int str,便利贴 a = 1 # 1. a贴在1上面 # 2. 它的过程是先生成对 ...
- Python说文解字_杂谈07
1. 深入dict from collections.abc import Mapping,MutableMapping # dict 属于mapping类型 a = {} print(isinsta ...
- Python说文解字_杂谈01
1. Python在Ubuntu下面下载Python 2. 安装依赖包 sudo apt-get update sudo apt-get install build-essential python- ...
- Python说文解字_杂谈06
1. 序列类型的分类: 容器类型:list.tuple,deque 扁平序列:str.bytes.bytearray.array.array 可变序列:list.dequte.bytearray.ar ...
- Python说文解字_杂谈03
1. 我们从前面的知识得到,所有的类都要继承自object这个基类(超类),另外我们知道“继承”可以继承类的属性和方法.我们起始通过type创建类的时候,自然而然的也会从ojbect继承他的一些属性和 ...
- Python说文解字_杂谈02
1. Py中三个中啊哟的概念type.object和class的关系. type生成了int生成了1 type->class->obj type用来生成类对象的 object是最顶层的基类 ...
- Python说文解字_详解元类
1.深入理解一切接对象: 1.1 什么是类和对象? 首先明白元类之前要明白什么叫做类.类是面向对象object oriented programming的重要概念.在面向对象中类和对象是最基本的两个概 ...
随机推荐
- CentOS7 静默安装Oracle XE 11g
Oracle XE简介 Oracle Database 11g 快捷版 (Oracle Database XE) 是一款基于 Oracle Database 11g 第 2 版代码库的小型入门级数据库 ...
- SpringBoot 系列教程之事务隔离级别知识点小结
SpringBoot 系列教程之事务隔离级别知识点小结 上一篇博文介绍了声明式事务@Transactional的简单使用姿势,最文章的最后给出了这个注解的多个属性,本文将着重放在事务隔离级别的知识点上 ...
- Ubuntu14.04 无法关机 SpamAssassin speech-dispatcher
在ubuntu14.04上安装完一些包后,关闭计算机就会出现关于标题中的两个错误. 1.在软件中心卸载spamAssassin 2.运行命令: sudo update-rc.d -f speech-d ...
- 通过GlobalAddAtom,GlobalGetAtomName方式发送字符串
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- Node.js NPM 管理包
章节 Node.js NPM 介绍 Node.js NPM 作用 Node.js NPM 包(Package) Node.js NPM 管理包 Node.js NPM Package.json 根据安 ...
- 前端第四篇---前端基础之jQuery
前端第四篇---前端基础之jQuery 一.jQuery介绍 二.jQuery对象 三.jQuery基础语法 四.事件 五.动画效果 六.补充each 一.jQuery简介 1.jQuery介绍 jQ ...
- python -- unittest测试用例函数无法传参的处理方法(ddt)
1.超继承 重写测试用例类的init方法,如下所示. import requests import unittest class XiaoheiCases(unittest.TestCase): de ...
- python---函数定义、调用、参数
1.函数定义和调用 下面def test部分的代码块是函数定义:test(2,3)则是函数调用 def test(a,b): print(a) print(b) test(,) 2.必填参数,即函数调 ...
- HDU 4662 MU Puzzle(找规律)
题意:问是否能把MI通过以下规则转换成给定的字符串s. 1.使M之后的任何字符串加倍(即,将Mx更改为Mxx). 例如:MIU到MIUIU.2.用U替换任何III.例如:MUIIIU至MUUU.3.去 ...
- HDU 5475:An easy problem 这题也能用线段树做???
An easy problem Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...