• Python之路_Day8


    Python之路_Day8_课堂笔记

    前期回顾


    本期内容
    一、作业
    要点:
    二、上节内容回顾和补充
    面向对象三大特性:
    多态
    三、面向对象中成员
    字段
    方法
    属性
    四、成员修饰符
    五、特殊成员
    __init__
    __doc__
    __call__
    __setitem__
    ...
    六、面向对象其他知识
    - isinstance
    - issubclass
    - 继承 2.7
    - 应用:
    自定义类型,对字典进行补充,有序字典
    源码的扩展
    七、异常处理
    八、设计模式之单例模式
    类方法
    静态方法

    一、作业
    要点:
    1、封装,对象中嵌套对象
    2、pickle,load:切记,一定要先导入相关的类


    二、上节内容回顾和补充
    面向对象基本知识:
    1、类和对象的关系
    2、三大特性:
    封装
    W9EYWL5XZ7GW@~33H{7{%66.jpg
    继承
    _MX0NRMI7(W]%VQWQ}CG7I8.png
    3、多态:多种形态,多种类型
    python的多态
    def func(arg):
    print(arg)
    func(1)
    func("sandler")
    func([11,22,33])

    C#/Java的多态
    def func(int arg):
    print(arg)
    func(123)
    func("sandler")    # 报错



    三、面向对象中类成员
    1、字段
    class Foo:
    # 字段(静态字段)
    CC = 123
    def __init__(self):
    # 字段(普通的字段)
    self.name = 'sandler'
    def show(self):
    print(self.name)
    U57TX_1Z22D}[`}5})@_OMX.jpg
    1. #!/usr/bin/env python
    2. # -.- coding: utf-8 -.-
    3. # By sandler
    4. class Province:
    5. country = '中国'
    6. def __init__(self,name):
    7. self.name = name
    8. hn = Province('河南')
    9. print(hn.name)
    10. print(Province.country)
    11. print(hn.country)

    一般情况下,自己访问自己的字段
    规则:
    普通字段只能用字段访问
    静态字段用类访问(万不得已的时候可以使用对象访问)
    PS:静态字段在代码加载时已经创建

    2、方法
    所有的方法属于类
    普通方法,有对象去调用执行(方法属于类)
    至少一个self,通过对象执行
    静态方法,由类调用执行
    任意参数,由类执行(对象执行)
    类方法,由类调用执行
    至少一个cls,类执行(对象执行)
    1. #!/usr/bin/env python
    2. # -.- coding: utf-8 -.-
    3. # By sandler
    4. class Province:
    5. country = '中国'
    6. def __init__(self,name):
    7. self.name = name
    8. # 普通方法,由对象去调用执行(方法属于类)
    9. def show(self):
    10. print(self.name)
    11. @staticmethod
    12. def f1(arg1,arg2):
    13. # 静态方法是有类调用执行(当方法内部不需要对象中封装的值时,可以将方法携程静态方法)
    14. print(arg1,arg2)
    15. @classmethod
    16. def f2(cls):
    17. # 类方法,由类执行
    18. print(cls)
    19. Province.f1(11,22)
    20. Province.f2()

    3、属性
    属性是个不伦不类的东西
    具有方法的写作形式,具有字段的访问形式,
    1. #!/usr/bin/env python
    2. # -.- coding: utf-8 -.-
    3. # By sandler
    4. class Pager:
    5. def __init__(self,all_count):
    6. self.all_count = all_count
    7. @property
    8. def all_pager(self):
    9. a1,a2 = divmod(self.all_count , 10)
    10. if a2 == 0:
    11. return a1
    12. else:
    13. return a1 + 1
    14. @all_pager.setter
    15. def all_pager(self,value):
    16. print(value)
    17. @all_pager.deleter
    18. def all_pager(self):
    19. print('del all_pager')
    20. p = Pager(101)
    21. ret = p.all_pager
    22. print(ret) # 获取
    23. p.all_pager = 111 # 设置
    24. del p.all_pager # 删除
    RMLYRLB~{I5SEEYAL9){R@G.png
    属性的另一种表达方式:
    1. #!/usr/bin/env python
    2. # -.- coding: utf-8 -.-
    3. # By sandler
    4. class Pager:
    5. def __init__(self,all_count):
    6. self.all_count = all_count
    7. def f1(self):
    8. return 123
    9. def f2(self,value):
    10. pass
    11. def f3(self):
    12. pass
    13. foo = property(fget=f1,fset=f2,fdel=f3)
    14. p = Pager(101)
    15. result = p.foo
    16. print(result) # 自动调用f1
    17. p.foo = 'sandler' # 自动调用f2
    18. del p.foo # 自动调用f3
    HWS]5I3PO@V]T`X}(@A5Y[A.png





    四、类成员修饰符
    公有:
    内部和外部都可以访问的字段

    私有:
    只能类自己本身成员可以访问
    只有内部可以访问的字段,在字段前加两个下划线表示私有字段,无法继承

    1. #!/usr/bin/env python
    2. # -.- coding: utf-8 -.-
    3. # By sandler
    4. # 成员修饰符
    5. class Foo:
    6. __cc = "123"
    7. def __init__(self,name):
    8. self.__name = name
    9. def f1(self):
    10. print(self.__name)
    11. @staticmethod
    12. def f3():
    13. print(Foo.__cc)
    14. # print(Foo.__cc)
    15. obj = Foo("san")
    16. obj.f3()
    17. Foo.f3()
    18. class Foo:
    19. __cc = "123"
    20. def __init__(self,name):
    21. self.__name = name
    22. def f1(self):
    23. print(self.__name)
    24. class Bar(Foo):
    25. def f2(self):
    26. print(self.__name)
    27. # obj = Bar("san")
    28. # obj.f2()
    29. # obj.f1()

    强制访问私有,一般不可以使用
    print(obj._Foo__name)




    五、特殊成员
    __init__
    构造方法,创建对象时自动执行
    __del__
    析构方法,当对象在内存中被释放时,自动触发执行    
    注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
    __doc__
    表示类的描述信息
    __module__
    表示当前操作的对象在那个模块
    __class__
    表示当前操作的对象的类是什么
    __call__
    对象后面加括号,触发执行。
    注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
    1. #!/usr/bin/env python
    2. # -.- coding: utf-8 -.-
    3. # By sandler
    4. class Foo:
    5. def __init__(self,name,age):
    6. self.name = name
    7. self.age = age
    8. def __call__(self, *args, **kwargs):
    9. print('call')
    10. def __str__(self):
    11. return '%s - %d' %(self.name,self.age)
    12. obj = Foo()
    13. obj()

    __dict__
    获取对象中的所有字段数据

    1. #!/usr/bin/env python
    2. # -.- coding: utf-8 -.-
    3. # By sandler
    4. class Foo:
    5. def __init__(self,name,age):
    6. self.name = name
    7. self.age = age
    8. def __call__(self, *args, **kwargs):
    9. print('call')
    10. def __str__(self):
    11. return '%s - %d' %(self.name,self.age)
    12. obj1 = Foo('san' , 18)
    13. obj2 = Foo('yuli' , 19)
    14. ret = obj1.__dict__
    15. print(ret)

    __str__
    如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。
    1. #!/usr/bin/env python
    2. # -.- coding: utf-8 -.-
    3. # By sandler
    4. class Foo:
    5. def __init__(self,name,age):
    6. self.name = name
    7. self.age = age
    8. def __call__(self, *args, **kwargs):
    9. print('call')
    10. def __str__(self):
    11. return '%s - %d' %(self.name,self.age)
    12. obj1 = Foo('san' , 18)
    13. obj2 = Foo('yuli' , 19)
    14. print(obj1)
    15. print(obj2)
    16. ret = str(obj1)
    17. print(ret)

    __getitem__、__setitem__、__delitem__
    用于索引操作,如字典。以上分别表示获取、设置、删除数据
    1. #!/usr/bin/env python
    2. # -.- coding: utf-8 -.-
    3. # By sandler
    4. class Foo:
    5. def __init__(self,name,age):
    6. self.name = name
    7. self.age = age
    8. def __call__(self, *args, **kwargs):
    9. print('call')
    10. def __str__(self):
    11. return '%s - %d' %(self.name,self.age)
    12. def __getitem__(self, item):
    13. print('getitem')
    14. def __setitem__(self, key, value):
    15. print('setitem')
    16. def __delitem__(self, key):
    17. print('delitem')
    18. obj = Foo('san' , 19)
    19. ret = obj['aa'] # getitem
    20. print(ret)
    21. obj['k1'] = 111 # setitem
    22. del obj['k1'] # delitem


    __getslice__、__setslice__、__delslice__
    该三个方法用于分片操作
    注:该三个方法在Python3中已经弃用,Python3中直接使用__getitem__,__setitem__,__delitem__
    1. #!/usr/bin/env python
    2. # -.- coding: utf-8 -.-
    3. # By sandler
    4. class Foo:
    5. def __init__(self,name,age):
    6. self.name = name
    7. self.age = age
    8. def __call__(self, *args, **kwargs):
    9. print('call')
    10. def __str__(self):
    11. return '%s - %d' %(self.name,self.age)
    12. def __getitem__(self, item):
    13. # item.start item.stop item.step
    14. print(type(item))
    15. return 123
    16. def __setitem__(self, key, value):
    17. # key.start key.stop key.step
    18. print(type(key),type(value))
    19. def __delitem__(self, key):
    20. # key.start key.stop ikeytem.step
    21. print(type(key))
    22. obj = Foo('san' , 19)
    23. ret = obj[1:4:2]
    24. obj[1:4] = [11,22,33,44]
    25. del obj[1:4]

    __iter__
    用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__
    1. #!/usr/bin/env python
    2. # -.- coding: utf-8 -.-
    3. # By sandler
    4. class Foo:
    5. def __iter__(self):
    6. return iter([11,22,33,44])
    7. obj = Foo()
    8. for item in obj:
    9. print(item)

    __new__,__metaclass__
    WNOK]YFDMQHA$20E_FU(KLV.png





    六、面向对象其他知识
    - isinstance    # 查看某个类是不是
    - issubclass    # 查看某个类是不是子类
    D63Y8ZBO9GJZ4%V7O)O`1OV.png
    - 继承 2.7
    - 执行父类构造方法
    1. #!/usr/bin/env python
    2. # -.- coding: utf-8 -.-
    3. # By sandler
    4. # 执行父类的构造方法
    5. class C1:
    6. def f1(self):
    7. print('C1.f1')
    8. class C2(C1):
    9. def f1(self):
    10. super(C2,self).f1() # 执行父类的f1
    11. print('C2.f1')
    12. obj = C2()
    13. obj.f1()

    - 应用:
    自定义类型,对字典进行补充,有序字典
    1. #!/usr/bin/env python
    2. # -.- coding: utf-8 -.-
    3. # By sandler
    4. # 有序字典
    5. class MyDict(dict):
    6. def __init__(self):
    7. self.li = []
    8. super(MyDict,self).__init__()
    9. def __setitem__(self, key, value):
    10. self.li.append(key)
    11. super(MyDict,self).__setitem__(key,value)
    12. def __str__(self):
    13. temp_list = []
    14. for key in self.li:
    15. value = self.get(key)
    16. temp_list.append("'%s',%s" %(key,value,))
    17. temp_str = "{"+",".join(temp_list)+"}"
    18. return temp_str
    19. obj = MyDict()
    20. obj['k1'] = 123
    21. obj['k2'] = 456
    22. print(obj)

    源码的扩展




    七、异常处理
    Z$)RN)[C]3`XC7WK~3ADPED.png




    八、设计模式之单例模式(23种,goF设计模式)
    单例模式
    用来创建单个实例
    ZUO98VS]ILAYHU1W%$MF[E8.jpg
    1. #!/usr/bin/env python
    2. # -.- coding: utf-8 -.-
    3. # By sandler
    4. # 单例模式
    5. class Foo:
    6. instance = None
    7. def __init__(self,name):
    8. self.name = name
    9. @classmethod
    10. def get_instance(cls):
    11. # cls 类名
    12. if cls.instance:
    13. return cls.instance
    14. else:
    15. obj = cls("san")
    16. cls.instance = obj
    17. return obj
    18. obj1 = Foo.get_instance()
    19. print(obj1)
    20. obj2 = Foo.get_instance()
    21. print(obj2)

    类方法
    静态方法












  • 相关阅读:
    POJ
    POJ
    BZOJ
    HDU
    codeforces
    BZOJ
    SPOJ
    SPOJ
    SPOJ
    HDU
  • 原文地址:https://www.cnblogs.com/sandler613/p/5626984.html
Copyright © 2020-2023  润新知