""""""
# 1. 谈谈你理解的面向对象?
"""
- 封装:
- 将一些函数封装到一个类中。
class DB(object):
def ...
def ...
def ...
def ...
class Cache:
...
...
- 将一些数据封装到一个对象中。

class Response(object):
def __init__(self):
self.status = False
self.error = None
self.data = None
@property
def json(self):
return self.__dict__
def index(request):
result = Response()
try:
result.status = True
result.data = '数据'
except Exception as e:
result.error = '处理失败'
return JsonResponse(result.json)
- 继承:
- super
- self到底是谁?

- 多态(鸭子模型)

"""

# 2. super的作用?
"""
class Base(object):
def func(self):
print('base.func')
super().func()


class Foo(object):
def func(self):
print('foo.func')


class Bar(Base,Foo):
pass
"""
"""
obj = Bar()
obj.func() # Bar -> Base -> Foo
"""
"""
obj = Base()
obj.func() # base
"""

# 3. self到底是谁?

# 4. 鸭子模型
# python
"""
def func(arg):
arg.send() # arg可以是任意对象,必须有send方法
"""
# java
"""
def func(string arg):
arg.send() # arg可以是string的对象也可以string的派生类的对象。
"""

# 5. 面向对象的应用场景?
"""
drf来进行描述。
- 视图,你在写接口时都继承过哪些类?
- request封装
"""

# 6. @classmethod和@staticmethod的区别?


# 7. 私有和公有(成员修饰符)

# 8. 成员
"""
class Foo:
a1 = 123 # 类变量/静态字段/静态数据
def __init__(self):
self.name = 'dogjian' # 实例变量/字段/属性

def func(self):
pass

@classmethod
def func(cls):
pass

@staticmethod
def func():
pass

@property
def json(self):
return ...
"""

# 9. 对象和对象的相加
"""
class Foo(object):
def __init__(self,num):
self.num = num
def __add__(self, other):
return self.num + other.a1

class Bar(object):
def __init__(self,a1):
self.a1 = a1

obj1 = Foo(9)
obj2 = Bar(11)

result = obj1 + obj2
print(result)
"""

# 10.特殊方法
"""
__dict__
__call__
__new__
- 序列化
- 单例模式

from rest_framework.serializers import Serializer
class Test(Serializer):
pass
ser = Test(instance='',many=True)
__getitem__
__setitem__
__delitem__
class Session(object):

def __setitem__(self, key, value):
print(key,value)

def __getitem__(self, item):
return 1

def __delitem__(self, key):
pass

obj = Session()
obj['x1'] = 123
obj['x1']
del obj['x1']
__iter__
__enter__
__exit__
...

"""

# 11. 手写单例模式
"""
import time
import threading
class Singleton(object):
lock = threading.RLock()
instance = None

def __new__(cls, *args, **kwargs):
if cls.instance:
return cls.instance
with cls.lock:
if not cls.instance:
cls.instance = super().__new__(cls)
return cls.instance

def task(arg):
obj = Singleton()
print(obj)
for i in range(10):
t = threading.Thread(target=task,args=(i,))
t.start()
time.sleep(100)

obj = Singleton()
"""

# 12. setitem
"""
class Session(object):

def __setitem__(self, key, value):
print(key,value)

def __getitem__(self, item):
return 1

def __delitem__(self, key):
pass

obj = Session()
obj['x1'] = 123
obj['x1']
del obj['x1']
"""

# 13. 面向对象上下文管理 *****
"""
class Foo(object):

def __enter__(self):
print('进入')
return 666

def __exit__(self, exc_type, exc_val, exc_tb):
print('退出')


obj = Foo()

with obj as x1:
print(x1) # 此时的x1是__enter__返回return的值
print('操作中...')
"""

# 14. 自己通过面向对象实现一个“栈”

# class Stack(object):
#
# def __init__(self):
# self.container = []
#
# def push(self, value):
# """
# 向栈插入数据
# :param value:
# :return:
# """
# self.container.append(value)
#
# def pop(self):
# """
# 从栈中取走数据
# :return:
# """
# return self.container.pop()


# 15. metaclass

# 类
# class Foo(object):
# country = '中国'
#
# def func(self):
# return 123

# 参数1:类名
# 参数2:继承
# 参数3:成员
# Foo = type('Foo',(object,),{'country':'中国','func':lambda self:123})

# 对象
# obj = Foo()
# ret = obj.func()
# print(ret)

############ 结论:对象是由类创建;类是由type创建;
# class MyType(type):
# def __init__(self,*args,**kwargs):
# super().__init__(*args,**kwargs)
#
# class Foo(object,metaclass=MyType):
# country = '中国'
# def func(self):
# return 123
############ metaclass作用:对象是由类创建;类默认是由type创建;metaclass可以指定让类由具体哪一个type创建。
"""
class MyType(type):
def __init__(self,*args,**kwargs):
print(args)
super().__init__(*args,**kwargs)
class Foo(metaclass=MyType):
pass
class Bar(Foo):
pass
"""
############ 结论:如果一个类的基类中指定了metaclass,那么派生类也会由于metaclass指定的type来创建类类。
"""
from django import forms

class LoginForm(forms.Form):
name = forms.CharField()

def index(request):
if request.method == 'GET':
form = LoginForm()
else:
form = LoginForm(request.POST)
if form.is_valid():
pass
"""


# from wtforms import Form
# from wtforms.fields import simple
#
# # LoginForm > Form > NewBase(metaclass=FormMeta) -> BaseForm
# class LoginForm(Form):
# name = simple.StringField()
# pwd = simple.StringField()


############ 类及对象创建的流程 ############
"""
class MyType(type):
def __init__(self, name, bases, dic):
print('2 type.init')
super().__init__(name, bases, dic)

def __new__(cls, name, bases, dic):
print('1 type.new')
return super().__new__(cls, name, bases, dic)

def __call__(self, *args, **kwargs):
print('3. type.call')
object = self.__new__(self,*args, **kwargs)
object.__init__(*args, **kwargs)

class Foo(object,metaclass=MyType):
def __init__(self):
print('3.2 foo.init')
def __new__(cls, *args, **kwargs):
print('3.1 foo.new')
return super().__new__(cls)

obj = Foo()
"""

################################ metaclass相关补充 ##############################
# class Foo(object):
# def func(self):
# print('foo.func')

# obj = Foo()
# obj.func()

# obj = Foo()
# Foo.func(obj)

################################ metaclass回顾 ##############################

# 1. 对象是由类创建;类是由type创建
# new_class = type('Foo',(object,),{})

# 2. metaclass指定类由那个type(泛指继承了type的类)创建。
# class MyType(type):
# def __init__(self,*args,**kwargs):
# print('创建Foo类')
# super().__init__(*args,**kwargs)
#
# class Foo(metaclass=MyType):
# pass

# 3. metaclass指定类由那个type(泛指继承了type的类)创建。
"""
class MyType(type):
def __init__(self, name, bases, dic):
print('2 type.init,在创建Foo类执行进行类的初始化')
super().__init__(name, bases, dic)

def __new__(cls, name, bases, dic):
print('1 type.new,创建Foo类 ')
foo_class = super().__new__(cls, name, bases, dic)
# print(foo_class) # <class '__main__.Foo'>
return foo_class

def __call__(self, *args, **kwargs):
print('3. type.call')
object = self.__new__(self,*args, **kwargs)
object.__init__(*args, **kwargs)

class Foo(object,metaclass=MyType):
def __init__(self):
print('3.2 foo.init')
def __new__(cls, *args, **kwargs):
print('3.1 foo.new')
return super().__new__(cls)

# Foo是一个类,Foo是MyType类创建的对象。所以 Foo(), MyType类创建的对象 -> MyType.call
obj = Foo()
"""

# 4. 如果 某类 中指定了metaclass=MyType,则 该类及其派生类 均由MyType来创建,例如:wtforms组件中使用。
"""
object
BaseForm
NewBase -> 由FormMeta创建。
Form
LoginForm
"""
# from wtforms import Form
# from wtforms.fields import simple
#
# class LoginForm(Form):
# name = simple.StringField()
# pwd = simple.StringField()

# 5. 如果 某类 中指定了metaclass=MyType,则 该类及其派生类 均由MyType来创建,例如:django form组件中使用。
"""
class MyType(type):
def __init__(self, name, bases, dic):
print('2 type.init,在创建Foo类执行进行类的初始化')
super().__init__(name, bases, dic)

def __new__(cls, name, bases, dic):
print('1 type.new,创建Foo类 ')
foo_class = super().__new__(cls, name, bases, dic)
# print(foo_class) # <class '__main__.Foo'>
return foo_class

class Foo(object,metaclass=MyType):
pass
"""
"""
...
BaseForm
temporary_class,是由 metaclass > DeclarativeFieldsMetaclass > MediaDefiningClass > type 创建的。
Form
"""
# from django import forms
#
#
# class LoginForm(forms.Form):
# name = forms.CharField()
#