1,

  1. # 面向对象的三大特性:继承,多态和封装
  2. # 继承:
  3. # 单继承: ****
  4. # 父类(超类,基类)
  5. # 子类(派生类) 派生方法和派生属性
  6. # 子类的对象在调用方法和属性:先用自己的,自己没有,采用父类的
  7. # 多继承:(面试)
  8. # 不会超过三个父类,不要超过三层 ***
  9. # 如果子类自己有用自己的,如果没有就用离子类最近的那个父类的
  10. # 抽象类和接口类 **
  11. # 经典类和新式类 继承规则不同,深度优先和广度优先 ***** (面试)
  12. # super 只有在python3中使用 mro ****
  13. # super 是根据mro 广度优先顺序找上一个类
  14. # 多态:(面试)
  15. # 多态和鸭子类型
  16.  
  17. # 封装:***(面试)
  18. # 私有的
  19. #__名字
  20. # 只能在类的内部调用,子类都无法继承
  21.  
  22. # 三个装饰器
  23. # @property **** 规范 面试 # @name.setter
  24. # @staticmethod ***
  25. # @classmethod ***** 当一个方法使用了类的静态变量时,就给这个方法加上@classmethod装饰器,默认传cls参数

2,

  1. class Goods():
  2. __discount = 0.8
  3. @classmethod
  4. def change_discount(cls):
  5. cls.__discount = 0.5
  6.  
  7. Goods.change_discount()

3,组合:表达的是什么有什么的关系 五颗星,一个类的属性是另外一个类的对象

4,面向对象的进阶

  1. # isinstance() 和 issubclass() ***
  2. # 反射 ****** 非常非常的重要,高级的设置,JAVA里面也有反射,会让程序变得很简洁,任何地方都可以用,模块函数都可以
  3. # setattr()
  4. # delattr()
  5. # getattr()
  6. # hasattr()
  7. # __str__ 和__repr__ ** 所有双下方法,知道有这么个方法就行,主要是很多人用不太好这些双下方法
  8. # __del__
  9. # item系列
  10. # __getitem__
  11. # __setitem__
  12. # __delitem__

5,isinstance 检查一个obj是否是一个类的对象

  1. class Foo():pass
  2. class Foo1():pass
  3. obj = Foo()
  4. print(isinstance(obj,Foo))
  5. print(isinstance(obj,Foo1))

6,issubclass(sub,super) 检查sub类是否是super类的派生类

  1. class A():pass
  2. class B(A):pass
  3. print(issubclass(B,A))

7,反射,非常非常重要的知识点,反射是用字符串类型的名字去操作变量,和eval有点类似

8,反射对象的属性

  1. name = 1
  2. eval('print(name)')
  3. # eval会有很大的安全隐患,因为你不知道你执行的代码是什么来自哪里,除非写死了,不然有很大的安全隐患
  4. # 但是反射就不会有安全问题,他不是真的拿到了一段python代码,他是操作内存中已经存在的变量
  5.  
  6. # 第一种:反射对象中的属性和方法
  7. class A:
  8. def func(self):
  9. print('in func')
  10.  
  11. a = A()
  12. a.name = 'Alex'
  13.  
  14. # 反射对象的属性
  15. ret = getattr(a,'name') # 通过变量名的字符串形式取到值
  16. print(ret)
  17. print(a.__dict__)
  18.  
  19. 变量名 = input(">>>")
  20. print(getattr(a,变量名))
  21. print(a.__dict__[变量名]) # 相当于这样,但是我们一般不这么用

9,反射对象的方法

  1. class A:
  2. def func(self):
  3. print('in func')
  4.  
  5. ret = getattr(a,'func')
  6. ret()

10,反射类的属性,方法和静态方法

  1. class A:
  2. price = 20
  3. def __init__(self,name):
  4. self.name = name
  5. def func(self):
  6. print('in func')
  7.  
  8. @classmethod
  9. def func2(cls):
  10. print('classmethod')
  11.  
  12. @staticmethod
  13. def func3():
  14. print('staticmethod')
  15.  
  16. a = A('lisa')
  17. # 反射对象的属性
  18. if hasattr(a,'name'):
  19. ret = getattr(a,'name')
  20. print(ret)
  21. # 反射对象的方法
  22. if hasattr(a,'func'):
  23. ret = getattr(a,'func')
  24. ret()
  25.  
  26. # 反射类的属性
  27. if hasattr(A,'price'):
  28. ret = getattr(A,'price')
  29. print(ret)
  30.  
  31. # 反射类的方法
  32. if hasattr(A,'func2'):
  33. ret = getattr(A,'func2')
  34. ret()
  35.  
  36. # 反射静态的方法
  37. if hasattr(A,'func3'):
  38. ret = getattr(A,'func3')
  39. ret()

11,反射模块的属性和方法

  1. # 模块my的代码
  2. day = "monday"
  3. def func():print('func in module my.py')
  1. import my
  2. # 反射模块的属性和方法
  3.  
  4. print(getattr(my,'day'))
  5. print(getattr(my,'func'))

12,反射自己模块中的变量,另外自己模块的函数也是可以的

  1. import sys
  2. year = 2019
  3. print(sys.modules['__main__'].year)
  4. print(sys.modules['my'])
  5.  
  6. def qqxing():print('qqxing')
  7.  
  8. # 反射自己模块中的变量
  9. ret = getattr(sys.modules['__main__'],'qqxing') # 这样写其实是有坑的,因为如果我不是在这个模块开始运行的,他就不叫__main__了
  10. ret()
  1. print(getattr(sys.modules[__name__],变量名)) # 这样就可以了

13,应用time模块的一个小实例,要反射的函数有参数如何处理?下面的例子给出了解答

  1. import time
  2. print(time.strftime('%Y-%m-%d %H:%M:%S'))
  3. print(getattr(time,'strftime')('%Y-%m-%d %H:%M:%S'))

14,一个模块中的类能不能反射得到

  1. import my
  2. print(getattr(my,"C")) # 拿到类
  3. print(getattr(my,"C")()) # 实例化

15,总结:什么.什么的形式都可以用反射来得到,目前我们没有用到太多应用他的场景,但是后面用到他的地方非常多

16,getattr和hasattr 是一对儿,夫妻档要一起用

17,setattr,delattr几乎不会用到的,不占用星,用的非常少

  1. class A:
  2. pass
  3.  
  4. a = A()
  5. setattr(A,'name','nezha')
  6. setattr(a,'name','alex')
  7.  
  8. print(A.name)
  9. print(a.name)
  10.  
  11. delattr(a,'name') # 删掉对象的会用类的name
  12.  
  13. print(A.name)
  14. print(a.name)

18,类里面内置的双下方法,__str__ 和__repr__  以前有讲过str()和repr()

  1. class A(object):pass
  2. # def __str__(self): # 只要是str方法,一定要返回一个字符串
  3. # return 'str方法'
  4.  
  5. a = A()
  6. print(str(a))
  7. 如果类里面的str方法没有实现,那么会去调用object类里面的str方法,返回类的字符串
  8. object里面有一个__str__,一旦被调用,就返回调用这个方法的对象的内存地址
  9. 运行结果:
  10. <__main__.A object at 0x1072d6320>
  1. class A(object):
  2. def __str__(self): # 只要是str方法,一定要返回一个字符串
  3. return 'str方法'
  4. # 自己实现了str方法会用自己的
  5. a = A()
  6. print(str(a)) # 会自动调用类里面的双下str方法
    运行结果:
  7. str方法

19,str print str %s

  1. class A(object):
  2. def __str__(self): # 自己写会定义一个比较人性化的结果
  3. return "A's object"
  4.  
  5. a = A()
  6. print(str(a))
  7. print(a) # 默认打印一个对象,就是打印出这个对象的地址,调用a.__str__
  8. # 这个不涉及原理或者什么,只是python的一种规定
  9. l = [1,2,3,4,5] # 实例化了一个列表类的对象
  10. print(l) # 为何打印l就会显示出里面的每一个元素,这就是他做了处理
  11. # [1, 2, 3, 4, 5]
  1. class A(object):
  2. def __str__(self): # 自己写会定义一个比较人性化的结果
  3. return "A's object"
  4.  
  5. a = A()
  6. print('%s:%s'%(A,a)) %s实际上走的也是双下str方法
  7. 运行结果:
  8. <class '__main__.A'>:A's object

20,__repr__,调用repr和%r方法会自动调用类里面的双下repr方法

  1. class Teacher(object):
  2. def __init__(self,name,salary):
  3. self.name = name
  4. self.salary = salary
  5.  
  6. def __str__(self): # 自己写会定义一个比较人性化的结果, 如果不返回str会报错的
  7. return "A's object"
  8.  
  9. def __repr__(self):
  10. return str(self.__dict__)
  11.  
  12. lisa = Teacher('lisa',100)
  13. print(lisa)
  14. print(repr(lisa))
  15.  
  16. 运行结果:
  17. A's object
  18. {'name': 'lisa', 'salary': 100}

21,总结一下

  1. # 自己没有定制双下repr方法,那么会调用父类的repr方法,输出对象的内存地址,
  2. # repr方法是str方法的备胎,自己没有定制str方法,那么会找repr方法,如果也没有repr方法,那么会调用父类的str方法。

22,repr是 str的备胎,str不能做repr的备胎

23,双下len方法,这些双下方法又称为魔法方法,是调用其他的自动来触发的

  1. class A:
  2. def __len__(self):
  3. return 100 # 返回值必须是整数,小数也不行
  4.  
  5. a = A()
  6. print(len(a))

23,__len__,这个方法必须实现了,才可以在下面调用,object类并没有定义所有的双下__len__方法,不一定所有的内置方法都被object收录了,比方说数字。有一些模块,比如说时间,不具备len,也没有意义,所以只能是所有的类都有的,会被object收录。定制对象的长度

  1. class Classes:
  2. def __init__(self,name):
  3. self.name = name
  4. self.student = []
  5.  
  6. def __len__(self):
  7. return len(self.student)
  8.  
  9. s9 = Classes('python')
  10. s9.student.append('lisa')
  11. s9.student.append('lucy')
  12. print(len(s9)) #

24,__del__双下del方法,析构方法,del 既执行了方法,又删除了变量,析构函数,在删除一个对象之前,在做一些收尾工作

  1. class A:pass
  2. # def __del__(self):
  3. # print('执行我啦!')
  4.  
  5. a = A()
  6. del a # 会自动调用双下del方法
  7. print(a) # 提示出错,NameError: name 'a' is not defined
  8. # 需要注意的是a 双下del 即使我们不定制,那么调用的时候也会自动去调用父类的双下del删除

25,del 被删除的情况,引用计数,达到零了会被删除,这是第一种情况,第二种情况,

26,双下__call__方法

  1. class A:
  2. def __init__(self,name,age):
  3. self.name = name
  4. self.age = age
  5. # def __call__(self):
  6. # print('执行我啦lala')
  7.  
  8. def __call__(self, *args, **kwargs):
  9. for k in self.__dict__:
  10. print(k,end=' ')
  11.  
  12. a = A('lisa',22)
  13. a() # TypeError: 'A' object is not callable ,不实现call方法会报出这个错误
  14. A('lisa',22)() # 见到这样的不要不认识,实际上就是调用双下call方法

day27:反射和双下方法的更多相关文章

  1. day 22 反射,双下方法

    反射: 反射:通过字符串去操作对象(类,空间等等)的属性或方法反射的四个方法 hasattr *** getattr *** setattr *** delattr *** # getattr 用法c ...

  2. 百万年薪python之路 -- 面向对象之 反射,双下方法

    面向对象之 反射,双下方法 1. 反射 计算机科学领域主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性.python ...

  3. day26——tyoe元类与object的联系、反射、函数与方法的区别、双下方法

    day26 type元类与object联系 type 获取对象从属于的类 python 中一切皆对象, 类在某种意义上也是一个对象,python中自己定义的类,以及大部分内置类,都是由type元类(构 ...

  4. Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究

    Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: ​ 反射的概念是由Smith在1982年首次提出的 ...

  5. Python反射和内置方法(双下方法)

    Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...

  6. Python面向对象之反射,双下方法

    一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  7. python之面向对象函数与方法,反射,双下方法

    一.函数和方法 1.函数和方法的区别 函数: 全都是显性传参,手动传参,与对象无关 方法: 存在隐性传参,与对象有关 1.1通过函数名可以判断 len()就是函数 str.count()就是方法 de ...

  8. Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法

    Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...

  9. python 面向对象专题(六):元类type、反射、函数与类的区别、特殊的双下方法

    目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3. 函数与类的区别 4. 特殊的双下方法 1. 元类type type:获取对象 ...

随机推荐

  1. PERFECT NUMBER PROBLEM(思维)

     题目链接:https://nanti.jisuanke.com/t/38220 题目大意:这道题让我们判断给定数字是否为完美数字,并给来完美数字的定义,就是一个整数等于除其自身之外的所有的因子之和. ...

  2. YYS FZU - 2278 (期望)JAVA

    题目链接: G - YYS FZU - 2278 题目大意: 我们现在想要收集到n个卡片,现在已知抽到每种卡片的概率为1/n,现在每隔(n-1)!天就可以进行一次抽奖,问收集齐所有卡片的期望天数. 具 ...

  3. 让iframe自适应高度-真正解决

    需求:实现 iframe 的自适应高度,能够随着页面的长度自动的适应以免除页面和 iframe 同时出现滚动条的现象. (需要只有iframe出现滚动条) 本人一开始这么写:会造成只有主页面加载是设定 ...

  4. C# - 表达式与语句

    表达式与语句(Expression&Statement) 操作数(Operands) 1.数字.2.字符.3.变量.4.类型.5.对象.6.方法 操作符(Operator) 参考:C# - 操 ...

  5. GPS车辆监控系统的启动方式

    我们通常用到的GPS车辆监控系统都有哪些启动方式,又有什么区别呢?通常GPS车辆监控系统都有热启.冷启.温启的技术指标,现参考如下:GPS开机定位分为冷启动.温启动和热启动三种:一.冷启动:以下几种情 ...

  6. Vs2013 使用EF6 连接mysql数据库

    最近在使用MySQL数据库,在使用EF框架连接MySQL数据库时发现了一个问题,使用DB First创建实体对象的时候会出现如下图的错误:您的项目引用了最新版实体框架….. (如下图)或者会出现新建实 ...

  7. mysql 动态sql的拼接以及执行、分页

    1:建立存储过程,标记参数: ),),)) BEGIN DECLARE start integer; )*limitz; set @sql = 'select * from dsos_vot_drug ...

  8. JavaScript入门学习笔记(二)

    JavaScript运算符: 算术运算符.赋值运算符和字符串连接运算符. 算法运算符与复制运算符用法参照Java: 字符串运算符: +运算符用于把文本值或字符串变量连接起来,适用于两个或更多字符串变量 ...

  9. Android 10开发者预览版功能介绍

    Android P的开发者预览版最亮眼的功能莫过于支持“刘海屏”等屏幕显示.同样在适配可折叠设备方面,Android Q的第一个开发者预览版也很“接地气”,谷歌早在去年11月就发布了对可折叠设备的支持 ...

  10. RabbitMQ 学习日记

    RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较 http://www.rabbitmq.com/tutorials/tutorial-one-dotnet ...