zoukankan      html  css  js  c++  java
  • Python之面向对象知识整理

    """"""
    # 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()
    #
  • 相关阅读:
    JAVA 冒泡排序代码
    随机数生成机制
    C#学习成果 兔子计算
    C#学习成果 质数判断
    3.24学习成果
    制作登录界面,登录成功后把用户名放在session里,在第3个页面读取session显示用户名
    编写一个简易的留言薄,实现添加留言和显示留言内容等功能
    编写一个jsp程序,实现用户登录,当用户输入的用户或密码错误时,将页面重定向到错误提示页,并在该页面显示30秒后 自动回到用户登录界面
    jsp输出当前时间
    jsp输出九九乘法表
  • 原文地址:https://www.cnblogs.com/Zzbj/p/15072750.html
Copyright © 2011-2022 走看看