From bf8148ca120b411f0c974cac26501c0abcb50fe5 Mon Sep 17 00:00:00 2001 From: zhangyitao Date: 2020年11月22日 21:53:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=84=E8=87=AA=E7=9A=84=E6=80=9D=E8=80=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 15/think.py | 23 ++++++++++++++++ 16/think.py | 18 ++++++++++++ 17/think.py | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 18/think.py | 51 ++++++++++++++++++++++++++++++++++ 4 files changed, 171 insertions(+) create mode 100644 15/think.py create mode 100644 16/think.py create mode 100644 17/think.py create mode 100644 18/think.py diff --git a/15/think.py b/15/think.py new file mode 100644 index 00000000..9abae8aa --- /dev/null +++ b/15/think.py @@ -0,0 +1,23 @@ +# coding:utf-8 +# 第15课 Python对象比较、拷贝 + +import copy + +if __name__ == "__main__": + l1 = [2222, [1, 22], 2, 3, '111', (1, 2)] + l2 = copy.deepcopy(l1) + + print(l1 == l2) + print(l1 is l2) + + print(l1[0] is l2[0]) + # 证明数字,字符串等不可变对象创建后只有唯一引用的数据,深拷贝也只是返回唯一 + print(l1[-2] is l2[-2]) + # 元组的拷贝始终唯一 + print(l1[-1] is l2[-1]) + # list + print(l1[1] is l2[1]) + + t1 = (100000, 1000) + t2 = copy.deepcopy(t1) + print(t1 is t2) \ No newline at end of file diff --git a/16/think.py b/16/think.py new file mode 100644 index 00000000..07f9f8c9 --- /dev/null +++ b/16/think.py @@ -0,0 +1,18 @@ + +if __name__ == "__main__": + + l1 = [1, 2, 3] + l2 = [1, 2, 3] + l3 = l2 + + print(l1 is l2) + print(l2 is l3) + + + def func(d): + d['a'] = 10 + d['b'] = 20 + + d = {'a': 1, 'b': 2} + func(d) + print(d) \ No newline at end of file diff --git a/17/think.py b/17/think.py new file mode 100644 index 00000000..c5c5387e --- /dev/null +++ b/17/think.py @@ -0,0 +1,79 @@ +import functools +import time + +if __name__ == "__main__": + + def my_decorator(func): + # 这个是装饰器传参位置 + def wrapper(*args, **kargs): + print('in wraps') + func(*args, **kargs) + return wrapper + + def greet(): + print('in greet') + + greet = my_decorator(greet) + greet() + + @my_decorator + def greet_1(): + print('in greet_1') + + greet_1() + print(help(greet_1)) + + def my_decorator_1(func): + + @functools.wraps(func) + def wrapper_1(*args, **kargs): + print("wrapper_1") + func(*args, **kargs) + return wrapper_1 + + @my_decorator_1 + def greet_2(): + print('in greet_2') + greet_2() + print(help(greet_2)) + + # 对于装饰器,一定有一个外层提供闭包接口,那么一定只有一个参数,func + def num(num): + def my_decorator_2(func): + @functools.wraps(func) + def wrapper_2(*args, **kargs): + print("wrapper_2 {}".format(num)) + func(*args, **kargs) + return wrapper_2 + return my_decorator_2 + + # 想要自定义参数 + # greet_3 = num(111)(greet_3) + @num(111) + def greet_3(num_g): + print('int greet_3 {}'.format(num_g)) + greet_3(222) + print(help(greet_3)) + + + class Count(): + def __init__(self, func, max_num): + print('init') + self._func = func + self._num = 0 + self._max = max_num + + # @functools.wraps(self._func) + def __call__(self, *args, **kargs): + self._func(*args, **kargs) + self._num += 1 + print('in call {}'.format(self._num)) + + # 生成 count 实例 + # greet_4 = Count(greet_4) + @Count + def greet_4(num1, num2): + print("greet_4 {} {}".format(num1, num2)) + + greet_4(1, 2) + # print(help(greet_4)) \ No newline at end of file diff --git a/18/think.py b/18/think.py new file mode 100644 index 00000000..03040441 --- /dev/null +++ b/18/think.py @@ -0,0 +1,51 @@ +if __name__ == "__main__": + # 自定义类定义,注意是定义,等于重载 type __call__ + class MyMeta(type): + def __init__(self, name, bases, dic): + super().__init__(name, bases, dic) + print("===>MyMeta.__init__") + print(self.__name__) + print(dic) + print(self.yaml_tag) + + def __new__(cls, *args, **kwargs): + print("===>MyMeta.__new__") + print(cls.__name__) + return type.__new__(cls, *args, **kwargs) + + def __call__(cls, *args, **kwargs): + print("===>MyMeta.__call__") + obj = cls.__new__(cls) + cls.__init__(cls, *args, **kwargs) + # super().__call__(*args, **kwargs) + return obj + + # 定义一个类,其实就是 class xxx() = type('xxx', (), {'yaml_tag': '!Foo', ...}) 这等于是 type 执行 __call__, 此方法中有 type.__new__, type.__init__ + # class Foo(metaclass=MyMeta) --> Foo = MyMeta('Foo', (), {'yaml_tag': '!Foo', ...}) + # --> MyMeta.__new__();MyMeta.__init__() + # 定义 Foo 指定 metaclass 时,等于要生成一个 meta 实例 执行 type.__call__, 而其中就会有 mymeta.__new__, mymeta.__init__ + class Foo(metaclass=MyMeta): + yaml_tag = "!Foo" + def __init__(self, name): + print("Foo.__init__") + self.name = name + + def __new__(cls, *args, **kwargs): + print("Foo.__new__") + return object.__new__(cls) + # 当 Foo 实例生成时 就会调用 type 或其子类 mymeta.__call__, 里头调用了 Foo 的 __new__, __init__ + foo = Foo("foo") + + + class MyMetaclass(type): + def __new__(mcs, name, bases, dict, **kwargs): + return type.__new__(mcs, name, bases, dict) + def __init__(self, name, bases, dic): + print('MyMetaclass init') + super().__init__(name, bases, dic) + + def __call__(cls, *args, **kwargs): + print("MyMetaclass.__call__():", args, kwargs) + return type.__call__(cls, *args, **kwargs) + # 说明了不是调用 MyMetaclass 的 __call__ + print(MyMetaclass("MyClass", (), {}))

AltStyle によって変換されたページ (->オリジナル) /