python编程高级篇(一)

python高级编程

之所以是高级编程,是因为涉及的概念比较抽象。
在python编程的世界里,一切皆是 对象,这是现实世界里的单身狗们所憧憬的的样子(玩笑!!)。
既然一切都是对象,就是说:类,类的实例,类属性,函数,变量等都是对象(object)。

对象类别判断
常用的函数有 typeisinstance

>>> type(1)
<class 'int'>
>>> isinstance(1,int)
True

二者的区别在于:
isinstance会考虑类的继承关系。

class x():
    pass

class y(x):
    pass

a=x()
b=y()
isinstance(a,x) # True
isinstance(b,x) # True,y 继承自 x
type(a) # <class '__main__.x'>
type(b) # <class '__main__.y'>

对象的自省机制
可以看作是发掘对象自身信息(类别、属性、继承关系和内置方法等)的途径,涉及的函数包括:
type(x), isinstance(x, y), 使用见上文。
dir(x), 返回x对象的属性列表

a = [1]
dir(a)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

hasattr(x, y) ,判断x对象是否具备y属性(方法)

>>> hasattr(a,'index')
True

is 和 == 的区别
值的比较:使用 “==”
对象所在内存地址(起始地址)的比较:使用 is

a=10000
>>> a==10000
True
>>> a is 10000
False
>>> id(10000)
1604871891344 # 对象10000 的地址
>>> id(a)
1604871891280 # 对象 a 的地址

python多态
定义时的类型和运行时的类型不同,函数的重写就是多态的一种体现。

抽象类
需要导入abc库,(抽象基类,abstract base class)。
抽象类自身无法直接实例化,其作用主要是定义抽象方法,通过子类对其进行继承,从而使子类必须实现抽象方法,之后才能实例化。
代码实例:

import abc

class A(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def md(self, arg):
        pass

class B(A):
    def md(self, arg):
        print(arg)

a = B()
a.md("test123")

类和实例

由于类之间的继承关系,因此在对类进行实例化时,对于类属性和实例属性的查询需要按照一定的规则从下向上按照继承关系进行搜索,这些规则包括:
深度优先,简称DFS
在这里插入图片描述
在上图中,类B和C继承于类A,而类D则继承了类B和C,具体:类D(B, C)。
深度优先的搜索顺序:D --> B --> A --> C

广度优先,简称BFS

同样是上图的继承关系,广度优先的搜索顺序:D --> B --> C --> A

C3算法
例如对于类A的搜索:
A.__mro__

super函数
主要功能:执行父类的实例化方法,对于类之间的继承关系的搜索遵循C3算法。
该函数避免了代码重复,同时扩展了类(子类)属性。

代码实例:
创建新类,继承元组类,实现对 可迭代对象的过滤:
例如:实例化时传入参数:列表 [2,-2,‘jr’,[‘x’, 6, ‘y’],4],返回其中大于0的元素组成的元组 (2, 6, 4)

class IntTuple(tuple):
    def __new__(cls,iterable):
        dl=lambda x:[y for l in x for y in dl(l)] if type(x) is list else [x]
        iterables = dl(iterable)
        g=( x for x in iterables if isinstance(x,int) and x >0 )
        return super(IntTuple,cls).__new__(cls,g)


IntTuple([2,-2,'jr',['x', 6, 'y'],4]) # 返回 (2, 6, 4)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值