文章目录

  • 面向对象(一)学会面向对象编程
    • 一、初步了解面向对象
    • 二、类的定义和使用
      • 经典类和新式类示例:
      • 实例化示例:
      • 类空间和实例空间
      • __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多态

  1. python里不支持多态,但是python处处是多态

  2. python中不支持多态是指语法上的多态,不需要额外的实现多态的代码

    根据多态语法来说,不属于多态(父类作为参数,传递子类对象)

  3. python里处处是多态,本身就实现了多态

  4. 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|面向对象(一)相关推荐

  1. python面向对象的优点_Python面向对象编程——总结面向对象的优点

    Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...

  2. 这可能是Python面向对象编程的最佳实践

    作者 | 崔庆才 来源 | 进击的Coder(ID:FightingCoder) Python 是支持面向对象的,很多情况下使用面向对象编程会使得代码更加容易扩展,并且可维护性更高,但是如果你写的多了 ...

  3. 第八课.Python面向对象(二)

    类的继承和多态 继承和多态与函数有共同的目的,都是为了减少代码的冗余,提高复用的效率: 根据"Python面向对象(一)"的笔记,我现在定义一个Cinema类: #父类 class ...

  4. Python面向对象编程:类继承和其衍生术语

    Python面向对象编程03:类继承和其衍生术语 前面我们讲到过正则表达式字符等,上一篇分享了面向对象编程和类的结构,最后稍微提到了继承. Python面向对象编程:深度认识类class_ Pytho ...

  5. 《Python面向对象编程指南》——1.2 基类中的__init__()方法

    本节书摘来自异步社区<Python面向对象编程指南>一书中的第1章,第1.2节,作者[美]Steven F. Lott, 张心韬 兰亮 译,更多章节内容可以访问云栖社区"异步社区 ...

  6. Python 面向对象 基础

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

  7. python面向对象类属性_python面向对象之类属性和类方法案例分析

    本文实例讲述了python面向对象之类属性和类方法.分享给大家供大家参考,具体如下: 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 -- 实例 使用面相对象开发, ...

  8. 关于python面向对象编程中、下列说法中_关于Python面向对象编程的知识点总结

    前言 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们 ...

  9. python对象编程例子-这是我见过最详细的Python面向对象编程!建议收藏!

    原标题:这是我见过最详细的Python面向对象编程!建议收藏! 面向对象编程和函数式编程(面向过程编程)都是程序设计的方法,不过稍有区别. 面向过程编程: 1. 导入各种外部库 2. 设计各种全局变量 ...

  10. python面向对象编程的优点-Python面向对象编程——总结面向对象的优点

    Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...

最新文章

  1. usb调试模式已打开,adb devices显示List of devices attached 解决办法!纽维K333一键ROOT,获取ROOT权限!...
  2. 新手如何登陆阿里云服务器,阿里云服务器怎么登陆
  3. Spring boot拦截器登录检查
  4. R学习_multitaper包解析2:子函数spec.mtm.dpss,dpssHelper
  5. P1307 [NOIP2011 普及组] 数字反转(python3实现)
  6. 腾讯云和阿里云mysql性能对比_阿里云腾讯云服务器官方性能及实际体验对比
  7. json 转 实体对象 报解析错误
  8. 【OpenGL ES】EGL+FBO离屏渲染
  9. 头号玩家VR跑步机KAT Walk Mini上市,支持各种主流VR头显
  10. 腾讯提出共享 AI,抢先布局游戏与多媒体 AI,首秀同声传译
  11. Canvas流星雨特效
  12. 【安卓开机启动】安卓JVM加载so库流程
  13. One PUNCH Man——聚类
  14. html5页面嵌入视频播放,使用HTML5在网页中嵌入音频和视频播放的基本方法
  15. The Kouga Ninja Scrolls(2018沈阳现场E+切比雪夫距离+线段树维护最大次大最小次小)
  16. 金融知识---------本票,汇票,支票的区别
  17. Halcon之单相机标定
  18. R语言基础题及答案(三)——R语言与统计分析第三章课后习题(汤银才)
  19. 海尔智家遭瑞信等多家大行下调目标价,未来增长空间有限?
  20. 同步调制国内论文学习

热门文章

  1. 浅论信息化环境下的印刷业发展
  2. 相亲交友v6.7.7
  3. 拼多多新手商家开直通车一定要避免的雷区有哪些?
  4. 3轴/6轴/9轴传感器是什么, 加速计/陀螺仪/磁力计又是什么?
  5. 如何建立起一套有效的APP监控体系
  6. 弘辽科技跨境电商创业不得不知的6个问题,第一,哪些人适合,有哪些门槛
  7. cm11修改wifi_mac地址
  8. 从零开始搭建仿抖音短视频APP-开发用户业务模块(3)
  9. (非常实用)局部解剖学重点
  10. Hessian矩阵正定与函数凹凸性的关系