1.python一切皆对象
函数和类也是对象,属于python的一等公民
- 赋值给一个变量
- 可以添加到集合对象中
- 可以作为参数传递给函数
- 可以当做函数的返回值
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'>
关键点:
- type -> class -> obj
- type是一个类,同时type也是一个对象
- 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")