python知识梳理一 —— 对象&魔法函数

1.python一切皆对象

函数和类也是对象,属于python的一等公民

  1. 赋值给一个变量
  2. 可以添加到集合对象中
  3. 可以作为参数传递给函数
  4. 可以当做函数的返回值

2.type & object & class

对象是类的实例,使用type()函数查看对象所属的类型

# -*- coding: utf-8 -*-
a=1
b="abc"
# type -> int -> 1
# type -> class -> obj 
print(type(1)) # <class 'int'>
print(type(int)) # <class 'type'>
print(type(b)) # <class 'str'>
print(type(str)) # <class 'type'>

class Student:
    pass

stu = Student()
print(type(stu)) # <class '__main__.Student'>
print(type(Student)) # <class 'type'>
print(int.__bases__) # (<class 'object'>,)
print(str.__bases__) # (<class 'object'>,)
print(Student.__bases__) # (<class 'object'>,)
# type是一个类,同时type也是一个对象
print(type.__bases__) # (<class 'object'>,)
# object是最顶层的基类
print(object.__bases__) # ()
print(type(object)) # <class 'type'>

关键点:

  1. type -> class -> obj
  2. type是一个类,同时type也是一个对象
  3. object是最顶层的基类

在这里插入图片描述
object是type的实例,list、str、dict、typle是object的子类,type创建出来的,因此list、str、dict、typle不仅是类也是对象,即一切皆对象,一切都继承object

3.常见内置类型

在这里插入图片描述
在这里插入图片描述

4.魔法函数

定义:以双下滑线开头并且以双下滑线结尾的函数
魔法函数不是object类的方法,而是在我们自己定义的类中随意添加的魔法函数,使用python内部的魔法函数,不建议自己定义

# eg.字符串表示,,__str__是面向用户的,而__repr__面向程序员
# _str__ 方法其实调用了 __repr__ 方法
__repr__:开发者模式下使用,函数不用调用,python解析器会自己调用
__str__:对对象进行格式化使用

字符串表示

 __repr__、__str__

集合、序列相关

__len__、__getitem__、__setitem__、__delitem__、__contains__	

迭代相关

__iter__、__next__	

可调用

__call__

with上下文管理器

__enter__、__exit__

数值转换

__abs__、__bool__、__int__、__float__、__hash__、__index__

元类相关

__new__、 __init__

属性相关

__getattr__、 __setattr__、__getattribute__、setattribute__、 __dir__

属性描述符

__get__、__set__、 __delete__

协程

__await__、__aiter__、__anext__、__aenter__、__aexit__

5.深入类与对象

多使用原生类型,性能高,比如len(dict/list/set…)
python动态语言,只有编译时才能发现代码的错误

1、抽象基类

  • 1.检查时某个类是否有某种方法 ?
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)
  • 2.强制某个子类必须实现某些方法
    eg.实现一个web框架,继承cache(redis, cache, memorycache),
    此时需要设计一个抽象基类,指定子类必须实现某些方法

  • 如何模拟一个抽象基类?

	class CacheBase():
		def get(self, key):
		    raise NotImplementedError # 抛出异常
		def set(self, key, value):
		    raise NotImplementedError
            
    class RedisCache(cacheBase):
        def set(self, key, value):
            pass
    redis_cache = RedisCache()        

2、类属性和实例属性
类属性和实例属性查找顺序:__mro__(广度优先)

3、mixin模式特点
1.Mixin类功能单一
2. 不和基类关联,可以和任意基类组合,基类可以不和mixin关联就能初始化成功
3,在mixin中不要使用super用法

4、try except finally
如果finally有return语句,则返回finally中放入return

def exe_try():
    try:
        print ("code started")
        raise KeyError
        return 1
    except KeyError as e:
        print ("key error")
        return 2
    else:
        print ("other error")
        return 3
    finally:
        print ("finally")
        # return 4

5、上下文管理器
(1)使用 with

#上下文管理器协议
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()

(2)使用contextlib包

import contextlib

@contextlib.contextmanager
def file_open(file_name):
    print ("file open")
    yield {}
    print ("file end")

with file_open("bobby.txt") as f_opened:
    print ("file processing")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值