暂无分类
暂无标签
发布于2020-06-25 20:27 阅读(473) 评论(0) 点赞(27) 收藏(5)
0
1
2
3
4
5
6
鸭子类型
a=[1,2]
b=[3,4]
c=[5,6]
d=['abc']
a.extend(b)
a.extend(c)
a.extend(d)
print(a)
class Cat(object):
def info(self):
print('i am cat')
class Dog(object):
def info(self):
print('i am dog')
class Duck(object):
def info(self):
print('i am duck')
animal_list=[Cat,Dog,Duck]
for animal in animal_list:
animal().info()
多态
抽象基应用场景
检查某个类中是否有某种方法
class Demo(object):
def __init__(self,li):
self.li=li
def __len__(self):
return len(self.li)
l=['C','凌云','九折']
d=Demo(l)
print(d) # <__main__.Demo object at 0x00000294FD5782E8>
print(len(d)) # 会触发__len__ return len(self.li) 所以返回3
#如何判断 Demo 中是否含有__len__魔法方法
print(hasattr(d,'__len__')) # 判断 d 的内部 是否含有__len__
from collections.abc import Sized
#判断d 是否是 Sized 这个类
print(isinstance(d,Sized)) # True 说明 d 是Sized 类型
#可以通过判断 d 是都是 Sized 的子类 然后进一步判断 d这个对象的类 是否含有 __len__方法`
注意
强制子类必须实现父类的方法
例子
class CacheBase(object):
def dele(self):
print('我是dele 方法 ')
def crea(self):
print('我是 crea 方法')
class RedisBase(CacheBase):
pass
r=RedisBase()
r.crea()
class CacheBase(object):
def dele(self):
print('我是dele 方法 ')
raise NotImplementedError
def crea(self):
print('我是 crea 方法')
raise NotImplementedError
class RedisBase(CacheBase):
# 子类 如果不重写 父类 方法 访问时 直接抛出异常
def dele(self):
print('我是dele 方法 ')
def crea(self):
print('我是 crea 方法')
r=RedisBase()
r.crea()
r.dele()
import abc
#注意 不是直接继承object 而是 继承abc.ABCMeta
class CacheBase(metaclass=abc.ABCMeta):
@abc.abstractmethod
def dele(self):
pass
def crea(self):
pass
class ReadisBase(CacheBase):
def dele(self):
pass
r=ReadisBase() # 这里 如果不重写父类中的方法,直接抛出异常
a=1
b='ni hao'
print(isinstance(a,(int,str))) # 返回值为布尔值
print(type(a)) # <class 'int'> 返回值是一个类
class Father(object):
pass
class Son(Father):
pass
ls=Son()
print(isinstance(ls,Son)) # True
print(isinstance(ls,Father)) # True 继承
print(type(ls) is Son) # True
print(type(ls) is Father) # False
print(f'Son_id:{id(Son)},Fathon_id:{id(Father)}')
基本查找顺序
class Fathon(object):
# 类属性
cls_ins=1
def __init__(self,a,b):
# 实例属性
self.a=a
self.b=b
# self._cls_ins=886
zs=Fathon(3,4)
print(zs.cls_ins,zs.a,zs.b) # 1 3 4
print(Fathon.cls_ins) # 1
print(Fathon.a) # AttributeError: type object 'Fathon' has no attribute 'a'
#对象 可以向上查找 可以访问到 类属性
#类不能向下查找 所以 只能访问到类属性 类名.实例属性
Fathon.cls_ins=778
zs.cls_ins=886 # 相当于封装
print(Fathon.cls_ins)
print(zs.cls_ins)
class MyText():
ins='cls_ins'
def __init__(self):
self.ins='ins'
t=MyText()
print(MyText.ins) # cls_ins
print(t.ins) # ins
多重继承查询顺序
class D(object):
pass
class B(D):
pass
class C(D):
pass
class A(B,C):
pass
print(A.__mro__)
# (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>
class Person(object):
name='会太阳'
class Student(Person):
def __init__(self,school_name):
self.school_name=school_name
hty=Student('Logic_edu')
print(hty.__dict__) # {'school_name': 'Logic_edu'} 当前对象的属性{‘属性’:'属性'}
print(dir(hty)) # 返回 [ ] 考虑到继承的成员
super函数
class A(object):
def __init__(self):
print('A')
class C(A):
def __init__(self):
print('B')
super().__init__()
class B(A):
def __init__(self):
print('C')
super().__init__()
class D(B,C):
def __init__(self):
print('D')
super().__init__()
if __name__=='__main__':
d=D()
print(D.__mro__)
'''
D
C
B
A
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)'''
原文链接:https://blog.csdn.net/weixin_44864954/article/details/106909315
0
1
2
3
4
5
6
7
8
9
作者:9384vfnv
链接: https://www.pythonheidong.com/blog/article/430414/07e2073185f08dbce082/
来源: python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系z452as@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!