面向对象基础

面向对象编程

面向过程编程:类似于工厂的流水线

  • 优点:逻辑清晰
  • 缺点:扩展性差

面向对象编程:核心是对象二字,对象属性和方法的集合体,面向对象编程就是一堆对象交互

  • 优点:扩展性强
  • 缺点:逻辑非常复杂

类与对象

  • 对象:属性和方法的集合体

  • 类:一系列相同属性和方法的集合体

现实世界中先有对象后有类,python中先有类,再实例化出对象

对象的属性的查找顺序

先对象本身-->类-->父类-->父类的父类-->object-->自己定制的元类-->type

给对象定制独有属性

  1. class People:
  2. pass
  3. p1 = Peolple()
  4. p1.name = 'nick'
  5. p2 = People()
  6. p2.name = 'tank'

对象的绑定方法

  1. class People:
  2. def eat(self):
  3. print(self, 'eat....')
  4. p1 = Peolple()
  5. p1.eat()
  6. p1.name = 'nick'
  7. p2 = People()
  8. p2.eat()
  9. p2.name = 'tank'

类与数据类型

  1. lis = [1,2,3] # lis = list([1,2,3])
  2. class foo:
  3. def __init__(self,name):
  4. self.name = name
  5. f = foo('name')
  6. lis.append(4) # 对象调对象绑定的方法,会自动传参
  7. list.append(lis,4) # 类调用对象绑定的方法,必须得传参

面向对象进阶

类的继承

继承父类,则会有父类的所有属性和方法

  1. class ParentClass1():
  2. pass
  3. class ParentClass2():
  4. pass
  5. class SubClass(ParentClass1,ParentClass2):
  6. pass

类的派生

继承父类的同时自己有init,然后也需要父类的init

  1. class ParentClass1():
  2. def __init__(self,name):
  3. pass
  4. class SubClass(ParentClass):
  5. def __init__(self,age):
  6. # 1. ParentClass1.__init__(self,name)
  7. # 2. super(SubClass,self).__init__(name)
  8. self.age = age

gll 加: 派生2中

1.不继承,指明道姓访问一个类的函数

2.严格按继承属性查找关系

super()会得到一个特殊的对象,该对象就是专门用来访问父类中属性的(按照继承的关系)

super().init(不用为self传值)

super的完整用法是super(自己的类名,self) ,在python2中需要书写完整,在python3中可以简化为super()

类的组合

类对象可以引用/当做参数传入/当做返回值/当做容器元素,类似于函数对象

  1. class ParentClass1():
  2. count = 0
  3. def __init__(self,name):
  4. pass
  5. class SubClass(ParentClass):
  6. def __init__(self,age):
  7. self.age = age
  8. pc = ParentClass1()
  9. sc = SubClass()
  10. sc.parent_class = pc # 组合 给对象赋予了属性,属性值为对象
  11. pc.count
  12. sc.parent_class.count # 0

菱形继承问题

新式类:继承object的类,python3中全是新式类

经典类:没有继承object的类,只有python2中有

在菱形继承的时候,新式类是广度优先(老祖宗最后找);经典类深度优先(一路找到底,再找旁边的)

多态与多态性

一种事物的多种形态,动物-->人/猪/狗

  1. # 多态
  2. import abc
  3. class Animal(metaclass=abc.ABCmeta):
  4. @abc.abstractmethod
  5. def eat():
  6. print('eat')
  7. class People(Animal):
  8. def eat():
  9. pass
  10. class Pig(Animal):
  11. def eat():
  12. pass
  13. def run():
  14. pass
  15. class Dog(Animal): # 报错
  16. def run():
  17. pass
  18. # 多态性
  19. peo = People()
  20. peo.eat()
  21. peo1 = People()
  22. peo1.eat()
  23. pig = Pig()
  24. pig.eat()
  25. def func(obj):
  26. obj.eat()
  27. class Cat(Animal):
  28. def eat():
  29. pass
  30. cat = Cat()

鸭子类型:只要长得像鸭子,叫的像鸭子,游泳像鸭子,就是鸭子.

类的封装

隐藏属性,只有类内部可以访问,类外部不可以访问

  1. class Foo():
  2. __count = 0
  3. def get_count(self):
  4. return self.__count
  5. f = Foo()
  6. f.__count # 报错
  7. f._Foo__count # 不能这样做 实在想用就用 _类名__属性,函数同理

类的property特性

  1. 定义时,在实例方法的基础上添加 @property 装饰器;并且仅有一个self参数

  2. 调用时,无需括号

  1. class People():
  2. def __init__(self,height,weight):
  3. self.height = height
  4. self.weight = weight
  5. @property
  6. def bmi(self):
  7. return weight/(height**2)
  8. @bmi.setter
  9. def bmi(self,value)
  10. print('setter')
  11. @bmi.deleter
  12. def bmi(self):
  13. print('delter')
  14. peo = People
  15. peo.bmi

类与对象的绑定方法和非绑定方法

没有任何装饰器装饰的方法就是对象的绑定方法, 类能调用, 但是必须得传参给self

被 @classmethod 装饰器装饰的方法是类的绑定方法,参数写成cls, cls是类本身, 对象也能调用, 参数cls还是类本身

被 @staticmethod 装饰器装饰的方法就是非绑定方法, 就是一个普通的函数

面向对象高级

isinstance,issubclass

isinstance判断是否为类的实例化对象,会检测父类,而type不会检测父类

issubclass,判断是否为其子类

反射

  1. hasattr:通过字符串判断是否类属性存在

  2. getattr:通过字符串获取类属性

  3. setattr:通过字符串修改类属性

  4. delattr:通过字符串删除类属性

gll添加:

应用场景:如何通过sys和getattr获取模块

  1. import time , sys, os
  2. mod = sys.modules['__main__'] # 获取的是当前导入的所有模块对应的总内存地址
  3. print(mod)
  4. tim = getattr(mod, 'time', None)
  5. path = getattr(mod, 'os', None)
  6. print(tim.time())
  7. print(path.path)

call

  1. class Foo:
  2. def __init__(self):
  3. print('Foo()会触发我')
  4. def __call__(self):
  5. print('Foo()()/f()会触发我')
  6. f = Foo()
  7. f()

new

  1. class Foo:
  2. def __new__(self):
  3. print('new')
  4. obj = object.__new__(self)
  5. return obj
  6. def __init__(self):
  7. print('init')
  8. f = Foo()

元类

元类用来造类的

元类()-->类-->init

元类()()-->对象--->call

类分为几部分:类名/类体名称空间/父类们

  1. class Mymeta(type):
  2. def __init__(self,class_name,class_bases,class_dic):
  3. # 控制类的逻辑代码
  4. super().__init__(class_name,class_bases,class_dic)
  5. def __call__(self,*args,**kwargs):
  6. # 控制类实例化的参数
  7. obj = self.__new__(self) # obj就是实例化的对象
  8. self.__init__(obj,*args,**kwargs)
  9. print(obj.__dict__)
  10. # 控制类实例化的逻辑
  11. return obj
  12. class People(metaclass=Mymeta):
  13. def __init__(self,name,age):
  14. self.name = name
  15. self.age = age

单例模式

利用类的绑定方法的特性

  1. NAME = 'nick'
  2. AGE = 18
  3. class People():
  4. __instance = None
  5. @classmethod
  6. def from_conf(cls):
  7. if cls.__instance:
  8. return cls.__instance
  9. cls.__instance = cls(NAME,AGE)
  10. return cls.__instance

People.from_conf()

People.from_conf()

利用装饰器

  1. NAME = 'nick'
  2. AGE = 18
  3. def deco(cls):
  4. cls.__instance = cls(NAME,AGE)
  5. def wrapper(*args,**kwargs):
  6. if len(args) == 0 and len(kwargs) == 0:
  7. return cls.__instance
  8. res = cls(*args,**kwargs)
  9. return res
  10. return wrapper
  11. @deco
  12. class People():
  13. def __init__(self,name,age):
  14. self.name = name
  15. self.age = age

peo1 = People()

peo2 = People()

利用元类(正宗的)

  1. NAME = 'nick'
  2. AGE = 18
  3. class Mymeta(type):
  4. def __init__(self,class_name,class_bases,class_dict):
  5. super().__init__(class_name,class_bases,class_dict)
  6. self.__instance = self(NAME,AGE)
  7. def __call__(self,*args,**kwargs):
  8. if len(args) == 0 and len(kwargs) == 0:
  9. return self.__instance
  10. obj = object.__new__(self)
  11. self.__init__(obj,*args,**kwargs)
  12. return obj
  13. class People(metaclass=Mymeta):
  14. def __init__(self,name,age):
  15. self.name = name
  16. self.age = age
  17. peo1 = People()
  18. peo2 = People()

异常处理

捕捉异常

  1. x = 10
  2. y = 20
  3. c = 30
  4. try:
  5. 1/0
  6. except Exception as e:
  7. print(e)

raise

抛出异常

  1. raise KeyboardInterrupt('中断捕捉')

assert

判断某一行代码是否有问题

python 面向对象基础和高级复习的更多相关文章

  1. Python 面向对象 基础

    编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...

  2. python面向对象基础

    面向对象基础 1. 简述 编程方式: 面向过程: 根据代码在脚本的堆叠顺序,从上到下依次执行 函数式编程:将相同功能的代码封装到函数中,直接调用即可,减少代码重复性 面向对象:对函数进行分类和封装,将 ...

  3. Python 面向对象基础知识

    面向对象基础知识 1.什么是面向对象编程? - 以前使用函数 - 类 + 对象 2.什么是类什么是对象,又有什么关系? class 类: def 函数1(): pass def 函数2(): pass ...

  4. 十六、python面向对象基础篇

    面向对象基础: 在了解面向对象之前,先了解下变成范式: 编程范式是一类典型的编程风格,是一种方法学 编程范式决定了程序员对程序执行的看法 oop中,程序是一系列对象的相互作用 python支持多种编程 ...

  5. 1.Python面向对象基础

    面向对象(OOP) 面向对象编程--object oriented programming 简写 OOP   面向过程和面向对象的区别: 面向过程: 1.把完成某一个需求的所有步骤从头到尾逐步实现 2 ...

  6. [python面向对象]--基础篇

    1.#类 #类就是一个模板,模板里可以包含多个函数,函数里实现一些功能 #定义一个类 class bar: def foo(self,agr): print(self,agr) obj = bar() ...

  7. Python面向对象基础:编码细节和注意事项

    在前面,我用了3篇文章解释python的面向对象: 面向对象:从代码复用开始 面向对象:设置对象属性 类和对象的名称空间 本篇是第4篇,用一个完整的示例来解释面向对象的一些细节. 例子的模型是父类Em ...

  8. python 面向对象编程(高级篇)

    飞机票 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对 ...

  9. Python面向对象基础一

    公司可能过一两个月就要从深圳搬到东莞松山湖,项目组的现在有的在转Java或其他语言的,问我们要不要转java+hoodap+spark方向,我还是先不转,毕竟之前是从ios转回C#,这现在在转其他的那 ...

随机推荐

  1. HDU - 3966-Aragorn' Story(树链剖分+线段树)

    链接:https://vjudge.net/problem/HDU-3966 题意: Our protagonist is the handsome human prince Aragorn come ...

  2. POJ1741(点分治)

    分治的时候SZ感觉是错的--但是貌似第一次找好重心就够了,之后SZ别太离谱就不会T,重心随一随缘就好-- #include <cstdio> #include <cstring> ...

  3. 学习flask的网址

    学习flask的网址: http://www.bjhee.com

  4. Java VisualVM添加Visual GC插件

    1.访问地址:https://visualvm.github.io/pluginscenters.html,找到自己JDK版本对应的插件下载地址(我的JDK版本为1.7.0_67): 2.点击该链接进 ...

  5. 语义分割丨PSPNet源码解析「测试阶段」

    引言 本文接着上一篇语义分割丨PSPNet源码解析「网络训练」,继续介绍语义分割的测试阶段. 模型训练完成后,以什么样的策略来进行测试也非常重要. 一般来说模型测试分为单尺度single scale和 ...

  6. java分为 三类 ME,SE,EE

    java分为 三类  ME,SE,EE Java SE=Java Standard EditionJava EE=Java Enterprise Edition Java ME=Java Mobile ...

  7. meta标签的一些用法

    meta是html语言head区的一个辅助性标签.几乎所有的网页里,我们可以看到类似下面这段的html代码: <head> <meta http-equiv="conten ...

  8. ios 12 xcode10 新升级的编译报错libstdc++.6.0.9 Multiple commands produce

    问题一 编译报错 Showing Recent Messages :-1: Multiple commands produce '/Users/duning/Library/Developer/Xco ...

  9. Modelsim与Simulink协同仿真

    当使用硬件描述语言(HDL)完成电路设计时,往往需要编写Testbench对所设计的电路进行仿真验证,测试设计电路的功能是否与预期的目标相符.而编写Testbench难度之大,这时可以借助交互式图形化 ...

  10. 51nod 1101 换零钱

    基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 10 20 50 100元.   ...