python|面向对象(一)
文章目录
- 面向对象(一)学会面向对象编程
- 一、初步了解面向对象
- 二、类的定义和使用
- 经典类和新式类示例:
- 实例化示例:
- 类空间和实例空间
- __init__方法
- __new__方法
- 单例模式
- 三、self详解
- 3.1 self代表的是当前对象,而非类
- 3.2 self 不一定非写成self
- 四、类的继承
- 4.1 类的继承
- 4.2 类和实例的关系判断
- 五、 python多态
面向对象(一)学会面向对象编程
一、初步了解面向对象
面向过程:着重于做什么 ==> 函数
面向对象:着重于谁去做 ==> 数据和功能 ==> 变量和函数
面向对象的优点:1.方便版本迭代更新 2.程序结构清晰明了
类:用来描述具有相同的属性和方法(能做的事)的对象的集合
对象:通过类定义的数据结构实例
数据结构:相互之间存在一种或多种特定关系的数据元素的集合
属性:对象的描述信息(有什么特性)
方法:对象的行为(能做什么)
面向对象的三大特点:封装、继承、多态
示例:
str1 = "abc"
print(dir(str1)) #查看属性和方法
#python里面一切皆对象==>保存的不只是"abc"这个值,还有引用计数,类型,属性和方法等
定义一个类:
# 类 只关注有什么属性,能做什么事情
# 具体怎么做,如何做 由主程序来实现
class ATM(object):atm_name = "jianhang"def draw_money(self):print("取钱!")# 实例化
a = ATM()
# 调用方法
a.draw_money()
#取钱!
print(dir(a),a)
# [...,'atm_name', 'draw_money'] <__main__.ATM object at 0x039586F0>
二、类的定义和使用
类:用来描述具有相同的属性和方法(能做的事)的对象的集合
类名的规范:一般首字母大写(驼峰式命名)
函数命名的规范:由小写字母和下划线组成
python2 vs python3
python2: 主流版本 – 2.7
python3: 主流版本 – 3.6以及以后版本
python2中分为经典类和新式类
只有显式地继承了object的类称为新式类,其他都是经典类
python3中默认都是继承object,所以都是新式类
经典类和新式类最大区别就在于有没有继承object
经典类和新式类示例:
# python2中 A类和B类是经典类,C类是新式类
# python3中 都是新式类
class A():pass
class B:pass
class C(object):pass
实例化示例:
class ATM():money = 50000# self 代表实例本身def draw_money(self,getmoney):if getmoney <= self.money:#实例的money 类的money#self.money = self.money - getmoneyself.money -= getmoneyprint(f"取了{getmoney},还剩余{self.money}")else:print("ATM余额不足")#实例化
atm1 = ATM()
atm2 = ATM()#属性和方法的访问,两个实例是互相独立的
atm1.draw_money(1000)
#取了1000,还剩余49000
atm2.draw_money(10000)
#取了10000,还剩余40000
print(atm1.money,atm2.money)
#实例的money
#49000 40000#属性的修改
atm1.money = 60000
print(atm1.money,atm2.money)
#60000 40000#属性的增加
atm1.area = "长沙"
atm2.area = "常德"
print(atm1.area, atm2.area)
#长沙 常德
print(ATM.money)
#50000
ATM.area = "湖南"
print(ATM.area)
#湖南# 删除实例属性,找到类属性
del atm1.area
print(atm1.area)
#湖南
类空间和实例空间
类创建的时候会生成类空间
实例化对象的时候就会生成实例空间,不同的实例,空间都是独立的
实例查找属性方法的时候,先在自己的实例空间找,找不到就去类空间找
类空间找不到就去父类找,一层一层往上找为什么实例可以访问类属性?
创建实例的时候,会有一个类对象指针,通过这个指针,实例就能访问类的属性和方法了
__init__方法
实例对象的构造方法(初始化方法)
实例化对象的时候就会自动调用__init__方法
class ATM():money = 50000# self 代表实例本身def __init__(self,area):self.area = areaself.bank = "jianshe"def draw_money(self,getmoney):if getmoney <= self.money:#实例的money 类的money#self.money = self.money - getmoneyself.money -= getmoneyprint(f"取了{getmoney},还剩余{self.money}")else:print("ATM余额不足")
atm1 = ATM("changsha")
atm2 = ATM("changde")
print(dir(atm1),dir(atm2))
#'area', 'bank', 'draw_money', 'money'
print(atm1.area)
#changsha
__new__方法
创建实例,一般情况下不需要重写
class ATM():money = 50000# self 代表实例本身def __init__(self,area):print("this is init")self.area = areaself.bank = "jianshe"def __new__(cls,*args, **kwargs):print("this is new method:",cls)print(args,kwargs)return object.__new__(cls)# cls 代表的就是当前类 ATM,将cls写成ATM也可以# return object.__new__(ATM2)# 返回值不是创建的当前类的实例化对象,不会执行__init__def draw_money(self,getmoney):if getmoney <= self.money:#实例的money 类的money#self.money = self.money - getmoneyself.money -= getmoneyprint(f"取了{getmoney},还剩余{self.money}")else:print("ATM余额不足")atm1 = ATM("changsha")
# 传入的参数先传给__new__方法,创建实例,接着进行实例初始化,将参数传给__init__方法print(atm1)
# this is new method: <class '__main__.ATM'>
# ('changsha',) {}
# this is init
# <__main__.ATM object at 0x039D36F0>
总结:
__new__是创建实例的方法
__init__对创建好的实例进行初始化工作的方法__new__方法必须传入一个参数(cls),代表当前类
new__必须要返回一个实例化对象
init__的self就表示__new__方法返回的实例,init__就对这个实例进行初始化
子类没有定义__new,就会去找父类的__new
新式类才有__new
如果实例化对象和本身class不一致,__init__就不会执行__new__方法属于静态方法
__init__方法属于实例方法
单例模式
无论实例化多少次,都只返回同一个对象实例
重写__new__
class A(object):obj = Nonedef __new__(cls, *args, **kwargs):if not A.obj:A.obj = object.__new__(cls)return A.obj
a1 = A()
a2 = A()
print(a1,a2)
#<__main__.A object at 0x03768610> <__main__.A object at 0x03768610>
三、self详解
3.1 self代表的是当前对象,而非类
class Person(object):name = 'sc'def info(self):print(f"i am {self.name}")print(self)print(self.__class__)def info2(self):self.info()print("this is info2")
p = Person()
p.info() #--->Person.info(p)
# i am sc
# <__main__.Person object at 0x010E3090>
# <class '__main__.Person'>
p.info2()
# i am sc
# <__main__.Person object at 0x02EC8750>
# <class '__main__.Person'>
# this is info2
3.2 self 不一定非写成self
约定俗成 大家都使用self
实例方法里面 第一个参数就代表实例本身,所以不一定非写成self
#可以不使用self
class Person(object):name = 'sc'def info(this):print(f"i am {this.name}")print(this)print(this.__class__)def info2():print("this is info2")def info3(self, age):print("this is info3")print(f"my age is {age}")p = Person()
#p.info2() #--》 Person.info2(p)
#TypeError: info2() takes 0 positional arguments but 1 was given
Person.info2()
#this is info2
p.info3(10) # --> Person.info3(10)
四、类的继承
4.1 类的继承
优点:减少代码的复用,简便
类的继承会继承父类的属性和方法
对象属性查找,先在对象实例空间查找,没有就去类空间查找
类空间没有就去父类空间查找,层层递归往上查找
class Animal(object):species = "Animal"count = 0def __init__(self):self.name = "animal"Animal.count += 1print("初始化Animal...")def breath(self):print("i can breath")def eat(self):print("i can eat")class Person(Animal):species = "Person" # 重写了父类的属性class Dog(Animal):def __init__(self):print("i am dog")def eat(self):print("dog is eating...")class Pig(Animal):count = 0def __init__(self):#最好放在子类定义的前面super().__init__() #子类访问父类的方法属性# self.name = "animal"# Animal.count += 1# print("初始化Animal...")self.name = "pig"Pig.count += 1print("初始化pig...")animal = Animal()
print(Animal.count, animal.count)
print("实例化person".center(30,'*'))
# 初始化Animal...
# 1 1p = Person()
# 继承父类的属性和方法
# 对象属性查找,先在对象实例空间查找,没有就去类空间查找
# 类空间没有就去父类空间查找,层层递归往上查找
print(p.count, p.species, Person.count,p.name) #子类没有__init__,就有父类的__init__
# **********实例化person***********
# 初始化Animal...
# 2 Person 2 animalprint("实例化dog".center(30,'*'))
d = Dog()
# print(d.name) 自己的__init__没有定义name属性
d.eat()
# ************实例化dog************
# i am dog
# dog is eating...print("实例化pig".center(30,"*"))
pig = Pig()
print(pig.count, pig.name, animal.count)
# ************实例化pig************
# 初始化Animal...
# 初始化pig...
# 1 pig 3
4.2 类和实例的关系判断
isinstance(实例,类) ==> 判断实例属不属于类
# 类和实例的关系判断
print("类和实例的关系判断".center(30,"*"))
print(isinstance(p, Person),isinstance(p, Animal), isinstance(pig,Animal))
# 初始化Animal...
# **********类和实例的关系判断***********
# True True
print(type(p))
#<class '__main__.Person'>
print(Pig.__base__)
#<class '__main__.Animal'>
五、 python多态
python里不支持多态,但是python处处是多态
python中不支持多态是指语法上的多态,不需要额外的实现多态的代码
根据多态语法来说,不属于多态(父类作为参数,传递子类对象)
python里处处是多态,本身就实现了多态
python崇尚鸭子类型:不关心对象是什么类型,到底是不是鸭子,只关心行为
示例:
class Zhifubao():def pay(self):print("this is zhifubao pay")class weixin():def pay(self):print("this is weixin pay")class wangyibao():def pay(self):print("this is wangyibao pay")zhi = Zhifubao()
wei = weixin()
wang = wangyibao()#接口 -- 不同形态
def pay(obj):obj.pay()pay(zhi)
pay(wei)
pay(wang)
python|面向对象(一)相关推荐
- python面向对象的优点_Python面向对象编程——总结面向对象的优点
Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...
- 这可能是Python面向对象编程的最佳实践
作者 | 崔庆才 来源 | 进击的Coder(ID:FightingCoder) Python 是支持面向对象的,很多情况下使用面向对象编程会使得代码更加容易扩展,并且可维护性更高,但是如果你写的多了 ...
- 第八课.Python面向对象(二)
类的继承和多态 继承和多态与函数有共同的目的,都是为了减少代码的冗余,提高复用的效率: 根据"Python面向对象(一)"的笔记,我现在定义一个Cinema类: #父类 class ...
- Python面向对象编程:类继承和其衍生术语
Python面向对象编程03:类继承和其衍生术语 前面我们讲到过正则表达式字符等,上一篇分享了面向对象编程和类的结构,最后稍微提到了继承. Python面向对象编程:深度认识类class_ Pytho ...
- 《Python面向对象编程指南》——1.2 基类中的__init__()方法
本节书摘来自异步社区<Python面向对象编程指南>一书中的第1章,第1.2节,作者[美]Steven F. Lott, 张心韬 兰亮 译,更多章节内容可以访问云栖社区"异步社区 ...
- Python 面向对象 基础
编程范式概述: 面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实 ...
- python面向对象类属性_python面向对象之类属性和类方法案例分析
本文实例讲述了python面向对象之类属性和类方法.分享给大家供大家参考,具体如下: 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 -- 实例 使用面相对象开发, ...
- 关于python面向对象编程中、下列说法中_关于Python面向对象编程的知识点总结
前言 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们 ...
- python对象编程例子-这是我见过最详细的Python面向对象编程!建议收藏!
原标题:这是我见过最详细的Python面向对象编程!建议收藏! 面向对象编程和函数式编程(面向过程编程)都是程序设计的方法,不过稍有区别. 面向过程编程: 1. 导入各种外部库 2. 设计各种全局变量 ...
- python面向对象编程的优点-Python面向对象编程——总结面向对象的优点
Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...
最新文章
- usb调试模式已打开,adb devices显示List of devices attached 解决办法!纽维K333一键ROOT,获取ROOT权限!...
- 新手如何登陆阿里云服务器,阿里云服务器怎么登陆
- Spring boot拦截器登录检查
- R学习_multitaper包解析2:子函数spec.mtm.dpss,dpssHelper
- P1307 [NOIP2011 普及组] 数字反转(python3实现)
- 腾讯云和阿里云mysql性能对比_阿里云腾讯云服务器官方性能及实际体验对比
- json 转 实体对象 报解析错误
- 【OpenGL ES】EGL+FBO离屏渲染
- 头号玩家VR跑步机KAT Walk Mini上市,支持各种主流VR头显
- 腾讯提出共享 AI,抢先布局游戏与多媒体 AI,首秀同声传译
- Canvas流星雨特效
- 【安卓开机启动】安卓JVM加载so库流程
- One PUNCH Man——聚类
- html5页面嵌入视频播放,使用HTML5在网页中嵌入音频和视频播放的基本方法
- The Kouga Ninja Scrolls(2018沈阳现场E+切比雪夫距离+线段树维护最大次大最小次小)
- 金融知识---------本票,汇票,支票的区别
- Halcon之单相机标定
- R语言基础题及答案(三)——R语言与统计分析第三章课后习题(汤银才)
- 海尔智家遭瑞信等多家大行下调目标价,未来增长空间有限?
- 同步调制国内论文学习