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)

类方法
静态方法












原文地址:https://www.cnblogs.com/sandler613/p/5626984.html