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的更多相关文章

  1. Python说文解字_杂谈05

    1. isinstance和type: is和==符号,is指的是内存地址,是不是一个对象,ID知否相同 集成链 class A: pass class B(A): pass b = B() prin ...

  2. Python说文解字_杂谈09

    1. 元类编程代码分析: import numbers class Field: pass class IntField(Field): # 数据描述符: # 初始化 def __init__(sel ...

  3. Python说文解字_杂谈08

    1. Python变量到底是什么? Python和Java中的变量本质不一样,python的变量实质是一个指针 int str,便利贴 a = 1 # 1. a贴在1上面 # 2. 它的过程是先生成对 ...

  4. Python说文解字_杂谈07

    1. 深入dict from collections.abc import Mapping,MutableMapping # dict 属于mapping类型 a = {} print(isinsta ...

  5. Python说文解字_杂谈01

    1. Python在Ubuntu下面下载Python 2. 安装依赖包 sudo apt-get update sudo apt-get install build-essential python- ...

  6. Python说文解字_杂谈06

    1. 序列类型的分类: 容器类型:list.tuple,deque 扁平序列:str.bytes.bytearray.array.array 可变序列:list.dequte.bytearray.ar ...

  7. Python说文解字_杂谈03

    1. 我们从前面的知识得到,所有的类都要继承自object这个基类(超类),另外我们知道“继承”可以继承类的属性和方法.我们起始通过type创建类的时候,自然而然的也会从ojbect继承他的一些属性和 ...

  8. Python说文解字_杂谈02

    1. Py中三个中啊哟的概念type.object和class的关系. type生成了int生成了1 type->class->obj type用来生成类对象的 object是最顶层的基类 ...

  9. Python说文解字_详解元类

    1.深入理解一切接对象: 1.1 什么是类和对象? 首先明白元类之前要明白什么叫做类.类是面向对象object oriented programming的重要概念.在面向对象中类和对象是最基本的两个概 ...

随机推荐

  1. 采用idea创建springboot mybatis web工程

    idea是一款强大的利器,最近公司换成采用springboot在eclipse上开发,因为idea的强大,故而,学习一下该利器,搭建springboot的web工程,在下面练习使用. 一.创建spri ...

  2. SSM文件上传要点总结

    文件的上传要点: 1.表单方面:enctype="multitype/form-data" 编码方式选择混编码 input 类型采用file 2.实体类一定要进行序列化,也就是im ...

  3. 使用Nginx搭建Tomcat9集群,Redis实现Session共享

    使用Nginx搭建Tomcat9集群,Redis实现Session共享 1.tomcat准备 首先准备两个tomcat9 ,修改配置文件server.xml 如果在多个服务器上分别启动tomcat 则 ...

  4. 【LeetCode】不同二叉搜索树

    [问题] 卡特兰(Catalan)数来源于卡特兰解决凸n+2边形的剖分时得到的数列Cn,在数学竞赛.信息学竞赛.组合数学.计算机编程等方面都会有其不同侧面的介绍.卡特兰问题的解决过程应用了大量的映射方 ...

  5. Vulkan SDK 之 Graphics Pipeline

    A graphics pipeline consists of shader stages, a pipeline layout, a render pass, and fixed-function ...

  6. JNI调用so动态库

    1.编写native接口 package org.demo; public class JniDemo { public static native int bmp2fea(byte[] bmp, b ...

  7. 打包|zip

    原始:gzip zip -r ./gzip.zip ./gzip/* adding: gzip/split_10.gz (deflated 2%) adding: gzip/split_11.gz ( ...

  8. jquery播放mp3

    $("button").on("click",function(){    $('embed').remove();            $('body'). ...

  9. 量化投资_Multicharts数组操作函数_append()追加函数(自定义)

    1. Multicharts中关于数组的操作比较麻烦,而且当中所谓的动态数组的定义并不是像其他语言那种的概念.因此要对数组进行元素“”追加“”的话,需要重新更改数组的索引,然后再最后一个位置添加val ...

  10. git使用代理

    在使用git科隆一个repo的时候,因为这个repo的子模块是托管在google上的,还是因为gfw导致子模块科隆不下来 只好使用代理了,那么怎么配置git使用代理呢 代码如下 因为我用的是ss所以这 ...