python 支持面向过程编程和面向对象编程。

传统面向过程编程,也叫函数式编程,通过我们的需求设计成一个一个的函数来完成,对一些小规模程序来说面向过程确实简单方便不少。而随着互联网的发展,对于一些大型的项目来说,使用面向对象编程更具有优势,在后期的维护上也更加容易。

面向对象编程有三大特性:封装、继承、多态。

类的创建

class 类名(父类名称):
类体 # 其中类体包括 类成员,方法,数据属性等
# object 是所有类的祖父类
# 类体也可以用 pass

简单类的组成

class per(object):
"注释" #类文档字符串 '*' "*" """"*""
var=1.1 #类变量、类属性。成员变量
def __init__(self): #构造方法
print("构造 ……")
def __del__(self): #析构方法
print("析构 ……")
def run(self): #类成员方法
print("run ……") tmp=per() #实例化对象
tmp.run() #调用类对象方法
print(tmp.__doc__) #打印注释字符串 输出:
构造 ……
run ……
注释
析构 ……

封装

主要是以类的方式将我们的需求抽象为实体后所共有的特性组成的集合,通过将属性与方法封装在一个对象中,只对外提供所需接口。是我们的程序结构、逻辑层次上更加清晰,便于程序的开发和后期维护。

类属性和实例属性

在python的类中,属性主要分为两种,一种是类属性,它直接分布在类中,不需要我们的实例就可以调用。

另一种是实例属性,实例属性只能依赖实例调用。

其中

  • 实例属性和实例方法只能被该类的实例访问
  • 类变量可以直接被类和类所创建的实例访问
  • 类变量只能通过类去修改,不可以通过类的实例去修改
class per(object):
var = 1.1 #类变量
def run(self):
print("runing ……") tmp=per() #实例1 tmp
tmp2=per() #实例2 tmp2
print(per.var) #直接通过类访问类变量
print(tmp.var,tmp2.var) #通过实例1,实例2访问类变量
tmp.name = "张三" #实例1 tmp.name
tmp2.age = 18 #实例2 tmp2.age
print(tmp.name) #输出实例1 的name
print(tmp2.age) #输出实例2 的age 输出:
1.1 #类变量 var 的值
1.1 1.1 #
张三 # tmp.name 的值
18 # tmp2.age 的值

实例拥有自己的空间,我们通过类外绑定属性的方式生成的实例属性不是所有实例(对象)所共有的,实例1不具有实例2的属性 age,实例2也不具有实例1的属性 name。同时类也拥有自己的空间,保存着类和对象所共有的属性 如 var,但是类不可以调用实例方法,如per.run() 就是不允许的。

只能通过类修改类变量。

print("var =",per.var)
per.var = 100
print("var =",per.var) 输出:
var = 1.1
var = 100

可以通过构造函数定义实例变量。其中通过 self 修饰就可以定义实例变量

class per(object):
var = 1.1
def __init__(self,myname,myage):
self.name = myname #name 实例属性
self.age = myage #age 实例属性
def run(self):
print("runing ……") tmp=per("张三",18) #实例1 tmp
tmp2=per("李四",20) #实例2 tmp2
print(tmp.name,tmp.age) #输出实例1 的name,age
print(tmp2.name,tmp2.age) #输出实例2 的name,age

总结:

类属性,可以简单理解为定义在类方法外的属性。

实例属性,在__init__构造函数内定义的属性。

类属性可以直接用类名访问,修改,也可以用实例名访问,只读。并且,当实例访问类不存在的属性时,会在实例中新建属性

公有方法和私有方法

在python 中通过在实例属性或者实例方法前加上 __xx 会改变其对外方式,即被声明为私有模式。正常情况下所有实例属性默认为公有状态。

class per(object):
var = 1.1
def run(self):
print("run ……")
def __runing(self):
print("runing ……") tmp=per() #实例 tmp
tmp.run() #调用公有的实例方法
#tmp.runing() #私有的实例方法不可以在类外访问
#tmp.__rining() #

同样的,在实例变量例如 self.__name 是私有的实例变量,在类外也不可以访问。私有属性只可以在类内访问。

class per(object):
__var = 1.1 #私有类属性
def run(self):
print("run ……","\nvar = ",self.__var)
def __runing(self):
print("runing ……")
def getRuning(self):
self.__runing() tmp=per() #实例 tmp
tmp.run() #run() 方法内部访问私有属性
tmp.getRuning() #使用对外接口访问私有方法

继承


class 类名(父类1.父类2 . . . )
类体
子类继承父类的方法

设计 mylist类,继承我们的列表类

class mylist(list):
pass lst=mylist()
lst.append(11)
print(lst) 输出:
[11]

子类继承了父类的属性和方法。可以直接使用父类的方法,也可以对父类的方法进行再包装形成新的方法。

class mylist(list):
def headinsert(self,val):
"""实现头部插入"""
self.insert(0,val) lst=mylist()
lst.append(11)
lst.headinsert(1)
print(lst) 输出:
[1,11]
子类重写父类方法

如果父类方法不能满足的需求,可以在子类重写父类的方法。在子类方法与父类方法重名时,会优先调用子类的方法。

class mylist(list):
def headinsert(self,val):
"""实现头部插入"""
self.insert(0,val)
def copy(self):
"""重写list的copy方法"""
print("this is mylist.copy") lst=mylist()
lst.append(11)
lst.headinsert(1)
print(lst)
lst.copy() 输出:
[1, 11]
this is mylist.copy
扩展父类的方法

可以在子类中使用 super().xxx 调用父类的方法,比如我们想实现插入数据后提示 “ok” 的功能。

class mylist(list):
def append(self,val):
"""扩展list的append方法"""
super().append(val)
print("ok") lst=mylist()
lst.append(1)
lst.append(11)
print(lst) 输出:
ok
ok
[1, 11]

多继承

python中继承可以继承父类的构造函数,并且多继承是可以使用每个父类的方法的。

class  A():
def __init__(self,name,age):
self.name = name
self.age = age
def print_A(self):
print(self.name,self.age) class B():
def print_B(self):
print("this is B") class C(A,B):
"""多继承"""
pass c=C("张三",18)
c.print_A()
c.print_B()

如果继承的父类中存在同名方法,会从左至右、深度优先搜索第一个方法名。比如

 A         B
C(A) D(B)
E(C,D)

在这种关系的继承中,调用一个名为 func() 的方法,会依次从 C、A、D、B中搜索对应方法名。

多态

简单来讲就是一种方法在调用时呈现出不同的状态(不同的功能)。前面也讲到了,在子类中存在同名方法会优先调用子类的方法。下面的 Dog类,Cat类均继承自 Animal类,我们通过调用 todo() 方法来实现一种多态的方式。

class Animal():
def do(self):
print("我是动物 ") class Dog(Animal):
def do(self):
print("我是狗,汪~ ") class Cat(Animal):
def do(self):
print("我是猫,咪~") def todo(animal):
animal.do() a=Animal()
todo(a)
d=Dog()
todo(d)
c=Cat()
todo(c) 输出:
我是动物
我是狗,汪~
我是猫,咪~

todo()方法通过传入的参数类型不同,从而实现不同的功能,表现出多种状态。

python学习笔记(四)——面向对象编程的更多相关文章

  1. python学习笔记(七):面向对象编程、类

    一.面向对象编程 面向对象--Object Oriented Programming,简称oop,是一种程序设计思想.在说面向对象之前,先说一下什么是编程范式,编程范式你按照什么方式来去编程,去实现一 ...

  2. python 学习笔记7 面向对象编程

    一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...

  3. Python学习笔记之面向对象编程(三)Python类的魔术方法

    python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...

  4. python学习笔记1 -- 面向对象编程高级编程1

    说起高级其实也就是些基础的东西,但是活用和熟用肯定会大幅度提升代码质量 首先要记录的是面向对象的灵活性,及如何去控制其灵活性,她允许你在实例中新增属性和方法,允许你给类新增属性和方法,也支持在定义类时 ...

  5. python学习笔记1 -- 面向对象编程类和实例

    由于之前有一定基础,所以python中的类的概接受的比较快,与其他语言一样, python也是通过类来进行事务的抽象,一切皆对象,要不然怎么说程序员不缺对象呢. 言归正传,python中类的声明是cl ...

  6. python自动化测试学习笔记-7面向对象编程,类,继承,实例变量,邮件

    面向对象编程(OOP)术语: class TestClass(object):   val1 = 100       def __init__(self):     self.val2 = 200   ...

  7. python学习笔记_week6_面向对象

    面向对象 介绍(特性(class.object--->封装.继承,多态)).--->世界万物,皆可分类:世界万物,皆可对象 只要是对象,就肯定属于某种品类:只要是对象,就肯定有属性 你是上 ...

  8. javascript 学习笔记之面向对象编程(一):类的实现

    ~~想是一回事,做是一回事,写出来又是一回事~~一直以来,从事C++更多的是VC++多一些,从面向过程到面向对象的转变,让我对OO的编程思想有些偏爱,将一个客观存在的规律抽象出来总是让人比较兴奋,通过 ...

  9. C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域

    面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:假设不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这样的类作用域的层次嵌套使 ...

  10. python学习笔记(6)--面向对象学习

    本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.   引言 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做(人狗大战)的游戏,你就思 ...

随机推荐

  1. 微信小程序使用weui扩展组件踩坑

    最近在做微信小程序,引入weui的时候踩坑了好久,这里记录一下遇到的问题. 微信官方文档给了两种weui引入方式: 通过 useExtendedLib 扩展库 的方式引入,这种方式引入的组件将不会计入 ...

  2. 超简单的集成表达式树查询组件,Sy.ExpressionBuilder 使用说明

    Sy.ExpressionBuilder是一套依赖于表达式树上的集成的查询组件.设计的初衷没别的,就为了少写代码,让查询业务可以变得更加模式化.目前可以从nuget 获取到该组件. 来到查询,查询实体 ...

  3. Hive数仓

    分层设计 ODS(Operational Data Store):数据运营层  "面向主题的"数据运营层,也叫ODS层,是最接近数据源中数据的一层,数据源中的数据,经过抽取.洗净. ...

  4. LGP6442题解

    和SP13106是双倍经验哦 我们首先发现 \(m=20\),所以一言不合先状压. 然后发现状压了之后我们实际上要求的是有多少个子集按位或的值为全集,相当于求有多少个子集按位与的值为 \(0\).(把 ...

  5. dotnet 委托的实现解析(2)开放委托和封闭委托 (Open Delegates vs. Closed Delegates)

    前言 这是个人对委托的理解系列第二篇,部分翻译自 Open Delegates vs. Closed Delegates – SLaks.Blog,好像还没人翻译过,加上部分个人理解.希望能对大家理解 ...

  6. java-计算机

    计算机 硬件 装机:CPU 内存 主板 IO设备(input output) 冯诺依曼体系结构 CPU读取数据在运算器中运算传输到存储器,控制器控制输出结果. 软件

  7. python psutila模块(示例)

    # qianxiao996精心制作 #博客地址:https://blog.csdn.net/qq_36374896 import psutil import time import datetime ...

  8. 《浅谈产品》——加油APP的平台是如何做的

    最近油价又上涨了,我们平常去加油站加油用到"某滴加油"."某团加油"这些APP,一般情况下加200的油,各种优惠下来,最终只需要付170左右就可以了,基本是优惠 ...

  9. CF1553X Harbour.Space Scholarship Contest 2021-2022 (Div. 1 + Div. 2)

    掉大分 E 对于一个序列,把它排回去的最小次数是 $\sum置换环大小-1=错位个数-置换环个数$ 注意到m小于等于n/3.那么最多修正2m个错位.正确位置的个数必须大于等于n/3才可能在m次内修正. ...

  10. Prim算法求最小生成树

    首先在介绍这个算法之前我们要之明确一下什么是最小生成树的概念: 由 V 中的全部 n 个顶点和 E 中 n−1 条边构成的无向连通子图被称为 G 的一棵生成树,其中边的权值之和最小的生成树被称为无向图 ...