1.面对对象程序开发基础(oop)

面对对象:高内聚 低耦合

面向过程:
优点:效率高,执行速度快
缺点:维护性,移植性差,表达不出一类的语义
面向对象:
优点:可读性,可移植性,可维护性高
缺点:执行效率捎慢

1.类的定义

class Car():
pass
class Car(object):
pass

2.类的实例化

class Car():
pass
obj = Car()

3.类的基本结构:成员属性、成员方法

4.类的命名:大驼峰命名法(每个单词首字符大写)

1.面对对象的三大特征:封装 继承 多态

1.封装:对类中成员属性和方法的保护,控制内部成员的访问、修改、删除等操作

对象的相关操作

1.两个保护等级:
public:
private:在成员前面加上( __成员)下划线,默认是
2.类中的绑定方法(类的内部)
绑定到对象(对象调用方法,系统自动把该对象当成参数进行传递时)系统默认
绑定带类:对象或者类调用方法时,系统自动把该类当成参数进行传递 3.例子
class MyCar():
color = ""
__logo = ""
def drive(self):
pass
def __info():
pass
# 实例化
obj = MyCar()
obj.drive() 4.实例化的对象动态添加公有成员属性和方法
obj.color = "红色"
#__dict__查看对象或者类中的成员,返回一个字典:对象.__dict__
(1)动态添加无参方法
def dahuangfeng():
pass
# 对象.属性(自定义的) = 方法
obj.dahuangfeng = dahuangfeng
obj.dahuangfeng()
(2)动态添加有参方法
def qingtianzhu(name):
pass
obj.qingtianzhu = qingtianzhu
obj.qingtianzhu("擎天柱")
(3)动态添加lambda 匿名函数
obj.weizhentian = lambda : print("weizhentian")
obj.weizhentian() 5.在类外,让系统自动帮助传递obj这个对象参数
import types
def qingtianzhu(self,name):
pass
# 通过MethodType 来创建一个绑定方法,自动传递obj对象
obj.qingtianzhu = types.MethdType(qingtianzhu,obj)
obj.qingtianzhu("擎天柱")

类的相关操作

class MyCar():
color = ""
__logo = ""
def drive(self):
pass
def __info():
pass
1.定义的类访问公有成员属性和方法
MyCar.oil
MyCar.drive()
2.定义的类动态添加公有成员和属性
# 添加公有成员属性
MyCar.logo = ""
# 添加公有成员方法
(1)动态添加无参方法
def dahuangfeng():
pass
# 类.属性(自定义的) = 方法
MyCar.dahuangfeng = dahuangfeng
MyCar.dahuangfeng()
(2)动态添加有参方法
def qingtianzhu(name):
pass
MyCar.qingtianzhu = qingtianzhu
MyCar.qingtianzhu("擎天柱")
(3)动态添加lambda 匿名函数
MyCar.weizhentian = lambda : print("weizhentian")
MyCar.weizhentian() ##--**类和对象之间的注意点** 类中的成员只归属于当前这个类本身
对象可以调用其中的公有成员,但是没有修改和删除的权利,因为都归属于类,不是对象中的
类无法调用对象中的相关成员,但是对象可以调用类中的相关成员
# 对象调用类中成员
调用对象中的成员时,先看看自己有没有该成员
如果有就先调用自己没,没有调用类的

私有成员和删除成员

class Plane():
captain = "guo"
__airsister = 3
def fly(self):
pass
def fly2():
pass
def __plane_info(self):
print("%d" %(self.__airsister)
def __plane_info2():
print("%d" %(Plane.__airsister) def pub_info(self):
self.__airsister obj = Plane()
obj.fly()
obj.fly2() 1.私有成员的改名策略[_类名__成员名]
obj._Plane__airsister
Plane._Plane__airsister
obj._Plane__plane_info2
Plane._Plane__plane_info2 2.利用类内的公有方法简介调用私有成员(推荐)
obj.pub_info()
Plane.pub_info() ##--删除相关成员
3.实例化的对象删除公有成员属性和方法
obj.captain = "w"
del obj.captain
#
print(obj.captain)=>guo
# 删除方法
obj.func = lambda:pass
obj.func()
Plane.func()//error
del obj.func
obj.func()//error
4.定义的类删除公有成员属性和方法
del Plane.captain
#
print(obj.captain)=>error
# 删除方法
del Plane.fly
obj.fly()//error

类和对象的注意点

# 类空间和对象在内存中是两份空间
a.类空间在内存栈中
b.对象空间在内存堆中

__init__构造方法

# ###魔术方法(特定时机自动触发)
__doc__:
__name__:
__all__:指定类中方法(*)的范围 __all__ = ["a","测试"] __init__魔术方法(构造方法)
触发时机:实例化对象,初始化的时候触发
功能:为对象添加成员
参数:参数不固定,至少一个self参数
返回值:无 #(1)基本语法
class MyClass():
def __init__(self):
self.name = "a"
obj = MyClass()
obj.name // "a"
# (2)多参数构造方法
class MyClass():
def __init__(self,name):
self.name = name
obj = MyClass(name = "ab")
obj.name // "ab"

2.继承:一个类除了自己所拥有的属性方法之外,还获取了另一个类的成员属性和方法

一个类继承另外一个类,该类是子类(衍生类),被集成的这个类叫做父类(基类,超类)

类都默认集成父类 object

1.单继承

子父继承之后,子类不可以调用父类的公有成员

子父继承之后,子类不可以调用父类的私有成员

子父继承之后,子类可以重写父类的同名方法

class Human(object):
hair = "金色"
sex = "男"
def eat(self):
pass
def __makeboby(self):
pass
class Man(Human):
pass
obj = Man()

2.多继承

calss Father():
property = "cac"
def f_hobby(self):
pass
calss Mother():
property = "caaa"
def m_hobby(self):
pass
calss Daughter(Father,Mother):
pass
obj = Daughter()
obj.property//cac

super(py3.0+:广度优先 py2.7+:深度优先)

super()只调用父类的相关公有成员

super()调用方法时,必须是绑定方法默认传递该类的对象

calss Father():
property = "cac"
def f_hobby():
pass
calss Mother():
property = "caaa"
def m_hobby(self):
pass
calss Son(Father,Mother):
property = "son"
//利用类来调用父类的成员
def ski1(self):
Mother.property
Father.property
//利用对象调用父类的属性方法
def ski2(self):
self.property//son
//利用super调用父类的属性方法
def ski3(self):
super()//Son()
super().m_hobby()
super().property//cac
super().f_hobby()//error

菱形继承(钻石继承)

# 结构:
# a
# b c
# d
class a():
pty = 4
def f(self):
print(1)
print(self.pty)
class b(a):
def f(self):
print(2)
super().f()
print(3)
class c(a):
def f(self):
print(4)
super().f()
print(5)
class d(b,c):
pty = 4
def f(self):
print(6)
super().f()
print(7)
obj = d()
obj.f()//6241537

mro列表(返回的是方法调用顺序的列表,针对于多继承下的同名方法,按照列表的顺序依次调用):类.mro()

issubclass:判断是否存在子父关系,只要在一个继承链上即可,应用范围在类身上(语法与isinstance的使用一模一样)

isinstance:判断类型

3. 多态

不同的子类对象,调用相同的父类的方法,产生不同的执行结果

2. 魔术方法

__init__构造方法

# ###魔术方法(特定时机自动触发)
__doc__:
__name__:
__all__:指定类中方法(*)的范围 __all__ = ["a","测试"] __init__魔术方法(构造方法)
触发时机:实例化对象,初始化的时候触发
功能:为对象添加成员
参数:参数不固定,至少一个self参数
返回值:无 #(1)基本语法
class MyClass():
def __init__(self):
self.name = "a"
obj = MyClass()
obj.name // "a"
# (2)多参数构造方法
class MyClass():
def __init__(self,name):
self.name = name
obj = MyClass(name = "ab")
obj.name // "ab"

__new__魔术方法

魔术方法调用时,是按照触发时机排序,不是代码顺序

触发时机:实例化类生成对象的时候触发(触发时机在init之前)
功能:控制对象的创建过程
参数:至少一个cls接受当前的类,其他的根据情况决定
返回值:通畅返回对象或none # 1. 基本语法
class MyClass():
a = 1
def __new__(cls):
pass
obj = MyClass()//Node class MyClass(object):
a = 1
def __new__(cls):
# 借助父类object
obj = object.__new__(cls)
# 1.返回本类对象
return obj
# 2.返回其他类的对象
return object
# 3.不返回任何对象
return None
obj = MyClass() # 2.new方法的处罚时机要快于init # 3.new方法的参数要和init方法参数一一对应
class a():
def __new__(cls,name):
return object.__new__(cls)
def __init__(self,name):
self.name=name
# 4.注意点
如果返回的不是本类对象,不会调用init构造方法

__del__魔术方法(析构方法)

触发时机:当对象被内存回收的时候自动触发【1.页面执行完毕回收所有变量,2.所有对象被del的时候】
功能:对象使用完毕后资源回收
参数:一个self接受对象
返回值:无 class LangDog():
food = "吃肉"
def __init__(self.name):
self.name=name
def __del__(self):
print("del")
# 1.页面执行完毕回收所有变量
obj = LangDog("a")
print(obj.name)//a 刀疤
# 2.所有对象被del的时候
# 当一个值,没有任何变量指向 引用,这个值才会被真正的释放
other_obj = obj
print("开始")
del obj #删除的是obj的指向链接
print("结束")
#--开始 结束 del
# other_obj obj内存地址为同一个 other_obj = obj
print("开始")
del obj #删除的是obj的指向链接
del other_obj
print("结束")
#--开始 del 结束 # 3.模拟文件操作
#fp = open(文件,模式,编码)
#fp.read()
#fp.close() class ReadFile():
def __new__(cls,*args,**kwargs):
# 判断文件存在不存在
if os.path.exists(filename):
return object.__new__(cls)
else:
return None
def __init__(self,filename):
self.fp = open(filename,"r","utf-8")
def __del__(self):
self.fp.close()
def readcontent(self):
return self.fp.read()
obj = ReadFile(filename="ceshi.txt")
obj.readcontent()

__str__魔术方法

触发时机:使用print(对象)或者str(对象)的时候触发
功能:查看对象
参数:一个self接受当前对象
返回值:必须返回字符串类型 calss Cat():
gift = "传说中的小猫有九条命" def __init__(self,name):
self.name = name
def __str__(self):
return "123456"
def cat_info(self):
pass
tom = Cat("tangmu")
# 1.print答应改对象
print(tom)#123456
# 2.str
str(tom)#123456

__repr__魔术方法

触发时机:使用repr(对象时候触发)
功能:查看对象,与魔术方法__str__相似
参数:一个self接受当前对象
返回值:必须返回字符串类型 __str__ = __repr__ calss Cat():
gift = "传说中的小猫有九条命" def __init__(self,name):
self.name = name
def __repr__(self):
return "123456"
def cat_info(self):
pass
tom = Cat("tangmu")
repr(obj)#"123456"
# __str__ = __repr__
# 1.print答应改对象
print(tom)#123456
# 2.str
str(tom)#123456

__call__魔术方法

触发时机:把对象当作函数调用的时候自动触发
功能:模拟函数花操作
参数:一个self接受当前对象
返回值:看需求 # 1.基本用法
class MyC():
def __call__(self):
print("call")
obj = MyC()
obj()# call
# 2.模拟洗衣服的过程
calss Wash():
def step1(self,name):
print(name)
def step2(self):
print(2)
def step3(self):
print(3)
def __call__(self,name):
self.step1(name)//1
self.step2()//2
self.step3()//3
obj = Wash()
obj.step1("a")//a
obj.step2()//2
obj.step3()//3
obj("a") # 3.模拟内置方法 int 实现myint
import math
class MyInt():
def __call__(self,num):
if isinstance(num,bool):
if num ==True:
return 1
else:
return
elif isinstance(num,int):
return num
elif isinstance(num,float):
# <!--# 方法一-->
# <!--strvar = str(num)-->
# <!--return strvar.split(",")[0]-->
# <!--if num >= 0:-->
# <!-- return math.floor(num)-->
# <!--else:-->
# <!-- return math.ceil(num)-->
return math.floor(num) if num >= 0 else math.ceil(num)
elif isinstance(num,str):
if (num[0] == "+" or num[0] == "-")and num[1:].isdecimal():
if num[0] == "+":
sign = 1
else:
sign = -1
return eval((0 if num[1:].lstrip("0")=="" else num[1:].lstrip("0"))) * sign
elif num.isdecimal():
return eval((0 if num.lstrip("0") else num.lstrip("0")))
else:
return "error"
pass
myint = MyInt()
print(myint("+00002155251"))

boolintfloat

触发时机:使用bool(对象)的时候触发
功能:强制对象
参数:一个self接受当前对象
返回值:必须是布尔类型

add(与之相关的__radd__反向加法)(sub:- mul

五、python学习-面向对象的更多相关文章

  1. python学习------面向对象的程序设计

    一 面向对象的程序设计的由来 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说,就是直接编写 和 的序列来代表程序语言 ...

  2. python学习------面向对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...

  3. Python学习---面向对象的学习[基础]

    面向对象 面向对象的三大特性是指:封装.继承和多态. 说明: Python可以函数式编程,也可以面向对象编程 l 面向过程:根据业务逻辑从上到下写垒代码 l 函数式 :将某功能代码封装到函数中,日后便 ...

  4. Python学习---面向对象的学习[深入]

    类的深入学习    a. Python中一切事物都是对象     b. class Foo:             pass                obj = Foo()         # ...

  5. python学习-面向对象

    面向对象 编程方式的区别 过程式编程 函数式编程 面向对象式编程 面向对象编程 对象是类的一个实例 创建 class foo(): def __init__(self): #类的构造方法 pass d ...

  6. python学习——面向对象编程

    关于python面向对象编程,请参考: https://blog.csdn.net/zhoudaxia/article/details/23341261

  7. python学习 面向对象高级编程

    ---恢复内容开始--- 面向对象编程---oop,是一种编程思想,oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数 ...

  8. python 学习 面向对象编程

    面向对象编程---oop,是一种编程思想,oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行为了简化程序设计 ...

  9. python学习——面向对象的三大特性

    一.继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. 1.python中类的继承分为:单继承和多继承 class P ...

随机推荐

  1. asm 查看字节码

    a.asm global Start section .text inc dword [esi] push edi mov edi,[esp+0x14] λ nasm -f win32 a.asm - ...

  2. Flutter: provider 使用小部件的小部件构建的依赖注入系统

    文档 dependencies: provider: import 'package:dart_printf/dart_printf.dart'; import 'package:flutter/ma ...

  3. 两百万SPC空投来袭,带动市场热情!

    NGK投放项目的时间节点总是以牛市为主,像是上一次的BGV项目投放就在2020年末的数字加密货币牛市,其结果想必各位生态建设者们都已经见到了,在登陆交易所首日便高收于近889美金,创下惊人的近一千七百 ...

  4. 《容器高手实战: Dockerfile最佳实践》

    Dockerfile最佳实践一个容器对应一个进程一个Docker容器应该只对应一个进程,也就是一个Docker 镜像一般只包含一个应用的制品包(比如.jar). 在需要组合多个进程的场景,使用容器组( ...

  5. Scrapy项目_阳光热线问政平台

    目的: 爬取阳光热线问政平台问题中每个帖子的标题.详情URL.详情内容.图片以及发布时间 步骤: 1.创建爬虫项目 1 scrapy startproject yangguang 2 cd yangg ...

  6. python基础(2)字符串常用方法

    python字符串常用方法 find(sub[, start[, end]]) 在索引start和end之间查找字符串sub ​找到,则返回最左端的索引值,未找到,则返回-1 ​start和end都可 ...

  7. E百科 | 基于MEC的边缘AI服务

    简介: 阿里云边缘计算团队付哲解读5G下热门场景:边缘AI.作者:阿里云付哲,计算机科学与技术专业博士后,在流量检测.资源调度领域有深入研究,其论文<Astraea: Deploy AI Ser ...

  8. 使用Docker创建MongoDb服务

    使用Docker创建MongoDb服务 1.先拉mongodb镜像 docker pull mongodb:4.2.5 2.创建映射目录 创建mongo映射目录,用于存放后面的相关东西. mkdir ...

  9. POJ-3259(最短路+Bellman-Ford算法判负圈)

    Wormholes POJ-3259 这题是最短路问题中判断是否存在负圈的模板题. 判断负圈的一个关键就是理解:如果在图中不存在从s可达的负圈,最短路径不会经过一个顶点两次.while循环最多执行v- ...

  10. 10个顶级Python实用库,推荐你试试!

    为什么我喜欢Python?对于初学者来说,这是一种简单易学的编程语言,另一个原因:大量开箱即用的第三方库,正是23万个由用户提供的软件包使得Python真正强大和流行. 在本文中,我挑选了15个最有用 ...