面向对象基础

面向对象编程

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

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

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

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

类与对象

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

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

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

对象的属性的查找顺序

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

给对象定制独有属性

class People:
pass p1 = Peolple()
p1.name = 'nick' p2 = People()
p2.name = 'tank'

对象的绑定方法

class People:
def eat(self):
print(self, 'eat....') p1 = Peolple()
p1.eat()
p1.name = 'nick' p2 = People()
p2.eat()
p2.name = 'tank'

类与数据类型

lis = [1,2,3]  # lis = list([1,2,3])

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

面向对象进阶

类的继承

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

class ParentClass1():
pass class ParentClass2():
pass class SubClass(ParentClass1,ParentClass2):
pass

类的派生

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

class ParentClass1():
def __init__(self,name):
pass class SubClass(ParentClass):
def __init__(self,age):
# 1. ParentClass1.__init__(self,name)
# 2. super(SubClass,self).__init__(name)
self.age = age

gll 加: 派生2中

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

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

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

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

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

类的组合

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

class ParentClass1():
count = 0
def __init__(self,name):
pass class SubClass(ParentClass):
def __init__(self,age):
self.age = age pc = ParentClass1()
sc = SubClass() sc.parent_class = pc # 组合 给对象赋予了属性,属性值为对象
pc.count
sc.parent_class.count # 0

菱形继承问题

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

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

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

多态与多态性

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

# 多态
import abc class Animal(metaclass=abc.ABCmeta):
@abc.abstractmethod
def eat():
print('eat') class People(Animal):
def eat():
pass class Pig(Animal):
def eat():
pass
def run():
pass class Dog(Animal): # 报错
def run():
pass # 多态性
peo = People()
peo.eat()
peo1 = People()
peo1.eat()
pig = Pig()
pig.eat() def func(obj):
obj.eat() class Cat(Animal):
def eat():
pass
cat = Cat()

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

类的封装

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

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

类的property特性

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

  2. 调用时,无需括号

class People():
def __init__(self,height,weight):
self.height = height
self.weight = weight @property
def bmi(self):
return weight/(height**2) @bmi.setter
def bmi(self,value)
print('setter') @bmi.deleter
def bmi(self):
print('delter') peo = People
peo.bmi

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

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

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

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

面向对象高级

isinstance,issubclass

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

issubclass,判断是否为其子类

反射

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

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

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

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

gll添加:

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

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

call

class Foo:
def __init__(self):
print('Foo()会触发我')
def __call__(self):
print('Foo()()/f()会触发我') f = Foo()
f()

new

class Foo:
def __new__(self):
print('new')
obj = object.__new__(self)
return obj def __init__(self):
print('init') f = Foo()

元类

元类用来造类的

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

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

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

class Mymeta(type):
def __init__(self,class_name,class_bases,class_dic):
# 控制类的逻辑代码
super().__init__(class_name,class_bases,class_dic) def __call__(self,*args,**kwargs):
# 控制类实例化的参数 obj = self.__new__(self) # obj就是实例化的对象
self.__init__(obj,*args,**kwargs)
print(obj.__dict__) # 控制类实例化的逻辑 return obj class People(metaclass=Mymeta):
def __init__(self,name,age):
self.name = name
self.age = age

单例模式

利用类的绑定方法的特性

NAME = 'nick'
AGE = 18 class People(): __instance = None @classmethod
def from_conf(cls):
if cls.__instance:
return cls.__instance cls.__instance = cls(NAME,AGE)
return cls.__instance

People.from_conf()

People.from_conf()

利用装饰器

NAME = 'nick'
AGE = 18 def deco(cls):
cls.__instance = cls(NAME,AGE) def wrapper(*args,**kwargs):
if len(args) == 0 and len(kwargs) == 0:
return cls.__instance res = cls(*args,**kwargs)
return res return wrapper @deco
class People():
def __init__(self,name,age):
self.name = name
self.age = age

peo1 = People()

peo2 = People()

利用元类(正宗的)

NAME = 'nick'
AGE = 18 class Mymeta(type):
def __init__(self,class_name,class_bases,class_dict):
super().__init__(class_name,class_bases,class_dict)
self.__instance = self(NAME,AGE) def __call__(self,*args,**kwargs): if len(args) == 0 and len(kwargs) == 0:
return self.__instance obj = object.__new__(self)
self.__init__(obj,*args,**kwargs) return obj class People(metaclass=Mymeta):
def __init__(self,name,age):
self.name = name
self.age = age peo1 = People()
peo2 = People()

异常处理

捕捉异常

x = 10
y = 20
c = 30 try:
1/0
except Exception as e:
print(e)

raise

抛出异常

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. 洛谷2414(构建ac自动机fail树dfs序后遍历Trie树维护bit及询问答案)

    要点 这是一道蔡队题,看我标题行事 任意询问y串上有多少个x串,暴力找每个节点是不是结尾肯定是炸的,考虑本质:如果某节点是x的结尾,根据ac自动机的性质,x一定是此(子)串后缀.又有每个Trie节点的 ...

  2. loj2734「JOISC 2016 Day 2」女装大佬 || 洛谷P3615 如厕计划

    loj2734 洛谷P3615 http://218.5.5.242:9021/problem/185 不会做... 题解(来自ditoly): 这一步更详细的解释(来自kkksc03): 还是从后面 ...

  3. python大战机器学习——数据降维

    注:因为公式敲起来太麻烦,因此本文中的公式没有呈现出来,想要知道具体的计算公式,请参考原书中内容 降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中 1.主成分分析(PCA) 将n ...

  4. 转 Oracle 11g Rman – 08317错误

    在一次帮助客户解决归档满的过程中遭遇了此错误. 客户是新上线系统,11g版本.设置了归档清除脚本(脚本参考:http://www.ludatou.com/?p=766),结果发现以往没问题的脚本在此刻 ...

  5. SpringCloud多模块整理

    1.项目架构 —— project        父项目 —— client        子项目(客户端)    对外暴露的接口 —————— pom.xml          子项目的pom文件 ...

  6. (转) Linux 下的dd命令使用详解(摘录)

    使用dd命令克隆整个系统------http://www.cnblogs.com/jikexianfeng/p/6103504.html 原文:https://www.cnblogs.com/jike ...

  7. (转)命令passwd报错因inode节点处理记录

    命令passwd报错因inode节点处理记录 原文:http://blog.sina.com.cn/s/blog_506ed9e6010106kj.html 故障现象:      1.修改密码时报错 ...

  8. Windows3

    windows安装后的配置 没有网络适配器, 将USB中的驱动精灵的安装程序安装在win上, 启动精灵, 提示无法连接到网络, 使用Android类型的手机中的QQ浏览器扫码下载 win会有一些开机自 ...

  9. CoreDataDemo

    // User.h // CoreDataDemo // // Created by gaokunpeng on 15/2/4. // Copyright (c) 2015年 qianfeng. Al ...

  10. guacamole 0.9.13安装与配置

    以下命令很多都需要管理权限,建议使用管理员账号执行,遇到问题可以留言. Guacamole官网文档介绍翻译:http://www.cnblogs.com/ji-yun/p/5657709.html 1 ...