cbv源码
【1】什么是查找顺序
对象属性的查找顺序:
- 首先在对象自身的命名空间(属性字典)中查找属性。
- 如果在对象自身的命名空间中没有找到,则会向上查找该对象的类(class)的命名空间,直到找到对应的属性或达到类的顶层(通常是 object 类)。
方法的查找顺序:
- 首先在对象自身的类中查找方法,并调用该方法。
- 如果在对象自身的类中没有找到方法,则会按照对象的类继承关系(即 MRO,Method Resolution Order)来查找方法,确保子类的方法优先于父类的方法被调用。
【2】如何看cbv源码
需要看源码。 在看python源码的时候 一定要时刻提醒自己面向对象属性方法查找顺序
- 先从对象自己找
- 再去产生对象的类里面找
- 之后再去父类找
总结: 看源码只要看到了self点一个东西 一定要问你自己当前这个self到底是谁
cbv的源码 : 突破口在urls.py
from django.contrib import admin
from django.urls import path,re_path
from app01 import views
urlpatterns = [
# CBV源码
re_path('r^login/',views.MyLogin.as_view()),
]
# re_path('r^login/',views.view), 这里CBV跟FBV 一模一样
# '''这里可以看出CBV跟FBV在路由匹配上本质是一样的 都是路由 对应 函数内存地址'''
# 函数名/方法名 加括号优先级最高
# 这里我们可以假设一下
as_view()
要么是被@staticmethod修饰的静态方法
要么是被@classmethod修饰的类的方法 ✓
@classonlymethod
def as_view(cls, **initkwargs):
"""Main entry point for a request-response process."""
for key in initkwargs:
pass
# cls 就是我们自己写的类 MyCBV
def view(request, *args, **kwargs):
# cls 就是我们自己写的类
# self = MyLogin(**initkwargs) 产生一个我们自己写的类的对象
self = cls(**initkwargs)
self.setup(request, *args, **kwargs)
'''
需要看源码。 在看python源码的时候 一定要时刻提醒自己面向对象属性方法查找顺序
- 先从对象自己找
- 再去产生对象的类里面找
- 之后再去父类找
总结: 看源码只要看到了self点一个东西 一定要问你自己当前这个self到底是谁
'''
# CBV的精华
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
# 获取的当前请求的小写格式 如何对比当前请求方式是否合法
# get请求为例子
# post请求
if request.method.lower() in self.http_method_names:
handler = getattr(
self, request.method.lower(), self.http_method_not_allowed
)
'''
反射:通过字符串来操作对象的数学或者方法
handler = getattr(自己写的类产生的对象,'get',当找不到get数学或者方法的时候机会用到第三个参数)
handler = 我们自己写的类里面的get方法
'''
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
'''自动调用get方法'''
1
2
3
4
K-1713014960992)]
3
[外链图片转存中…(img-vlhfgnDB-1713014960992)]
4
[外链图片转存中…(img-fDJQkEjk-1713014960993)]