Python面向对象之类和对象实例详解


Posted in Python onDecember 10, 2018

本文实例讲述了Python面向对象之类和对象。分享给大家供大家参考,具体如下:

类和对象(1)

对象是什么?

对象=属性(静态)+方法(动态);

属性一般是一个个变量;方法是一个个函数;

#类的属性 就是 类变量

#实例变量:定义在方法中的变量,只作用于当前实例的类。

例子:

class Turtle:#python 中类名约定以大写字母开头
  '''关于类的简单例子。。。'''
  #属性 == 类变量
  color ="green"
  weight="10kg"
  legs=4
  shell=True
  mouth='big'
  #方法
  def climb(self):
    self.name = "test"  #实例变量:定义在方法中的变量,只作用于当前实例的类。
    print("我在很努力爬。")
  def run(self):
    print('我在很努力跑。')
  def bite(self):
    print('我要要要要要')
  def sleep(self):
    print('我要睡觉啦。')
#创建一个实例对象也就是类的实例化!
tt =Turtle() #类的实例化,也就是创建一个对象,类名约定大写字母开头
tt.bite() #创建好类后就能调用类里面的方法叻;
tt.sleep()

面向对象的特征:

oo = Object Oriented(面向对象)

1.封装(信息隐蔽技术)

python的列表list其实就是一个对象,它提供了很多方法:sort()、append()

封装后就可以直接调用里面的方法了!!!

2.继承

 子类自动共享父类之间数据和方法的机制。

class MyList(list):#创建一个类继承list的所有方法和属性
   pass   #相当于一个占位符
list1=MyList()  #类实例化
list1.append(1)  #继承后调用list的方法append()

3.多态

不同对象对同一方法响应不同行动。就是名字一样方法不一样:

>>> class A:
    def fun(self):
       print('aaaa')
>>>class B ():
    def fun(self):
       print('bbb')
>>> a=A()
>>>b=B()
>>>a.fun()
aaaa
>>>b.fun()
bbb

类和对象(2)

self是什么?

如果把类当做图纸,那么由类实例化后的对象就是可以住人的房子。self就相当于房子的门牌号,由self就可以找到对象。

一个类可以生成无数个对象,对象之间都很相似,因为都是来源与类的方法属性。当对象方法被调用时,对象就会将自己作为第一个参数传给self,python就是根据self知道哪一个对象在调用方法;

>>>class Ball():
    def setname(self,name):
       self.name=name
    def kick (self):
       print("我叫%r,谁踢我"%self.name)
>>>a=Ball()  实例化生成a对象
>>>a.setname('a') 调用方法设名为a
>>>b=Ball()
>>>b.setname('b')
>>>c=Ball()
>>>c.setname()
>>>a.kick ()  通过self知道是哪个对象调用kick方法
我叫'a',谁踢我
>>>b.kick()
我叫'b',谁踢我

python的魔法方法:

__init__(self) 这个是构造方法。

实例化一个对象时,这个方法就会在对象创建时(实例化类就是创建对象)自动调用。实例化时就会调用__init__(self)这个方法。

实例化对象是可以传入参数的,这些参数被传入init方法中,可通过重写方法来自定义对象初始化操作。

>>>class Ball:
    def __init__(self,name):
       self.name = name
    def kick(self):
       print('我叫%r,谁踢我'%self.name)
>>> b=Ball('b') #创建对象,这时__init__(self):就被调用了,可以传入b
>>>b.kick()
我叫'b',谁踢我

公有和私有:

公有和私有数据类型。python中对象的属性和方法都是公开的都是公有的通过.操作符访问。

python中定义私有变量只需在变量名或函数名前增加两个下划线‘__',那么这个函数、变量变为私的了。

>>> class P():
    __name="liyue"  #私有变量,外部不能通过.操作符直接访问了

类和对象(3):继承

语法:

class A(B):
   ………….

B我们叫父类、基类或超类;

A我们叫子类,子类继承父类的属性和方法;

例子:

>>> class Parent():
    defhello(self):
       print("helloliyue!")
>>> class Child(Parent):
    pass
>>> p=Parent()
>>> p.hello()
hello liyue!
>>> c=Child()
>>> c.hello()
hello liyue!

注意:如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性。

例子:

>>> class Parent():
    defhello(self):
       print("helloliyue!")
>>> class Child(Parent):
    defhello(self):
       print("hahah!")
>>> p=Parent()
>>>p.hello ()
hello liyue!
>>> c =Child()
>>>c.hello () #子类和父类方法相同,(子类重写父类方法)会覆盖父类方法,但是父类自己的方法不变
hahah!

super()函数:解决了子类就算重写父类方法或属性仍然可以继续使用父类的方法和属性。

具体实例及说明:

import random as r
#利用继承演示鱼游动方向位置。
class Fish():  #父类
  def __init__(self):
    self.x =r.randint(0,10)
    self.y =r.randint(0,10)
  def move(self):
    self.x -=1  #一直向西移动
    print("我的位置是:",self.x,self.y)
classGoldfish(Fish): #子类
  pass
classCarp(Fish):   #子类
  pass
classSalmon(Fish):  #子类
  pass
classShark(Fish):
  def __init__(self):  #这里重写了__init__方法,就会覆盖掉父类的方法了,用到super函数后就可以继续使用父类的方法。
  #super函数不用给定任何基类的名字(如下),它会一层层找出代码所有父类里面对应的方法,要改变该类的继承关系时只需修改这个类的父类就行就是括号里面的Fish。
    super().__init__() #super().重写的属性或方法
    self.hungry = True
  def eat(self):
    if self.hungry:
      print("我要吃了。。。")
      self.hungry = False
    else:
      print('好饱了。。。')
>>> f=Fish()
>>>f.move()
我的位置是: -1 3
>>>f.move()
我的位置是: -2 3
>>>g=Goldfish()
>>>g.move()
我的位置是: 4 4
>>>s=Salmon()
>>>s.move()
我的位置是: 8 1
>>>s.move()
我的位置是: 7 1
>>> s=Shark()
>>>s.eat()
我要吃了。。。
>>>s.eat()
好饱了。。。
>>>s.move()
我的位置是: 5 10  #这就是子类就可以使用父类的move()方法
>>>s.move()
我的位置是: 4 10

类和对象(4)

1.组合:一般把几个没有什么关系的类放在一起使用时通过组合类的方法。

例子:要求定义一个类,叫水池,水池里面有乌龟和鱼。

class Turtle():  #定义乌龟类
  def __init__(self,x):
    self.num = x
classFish():  #定义鱼类
  def __init__(self,y):
    self.num = y
classPool():   #定义水池类
  def __init__(self,x,y):
    self.turtle = Turtle(x)  #直接把需要的类在这里实例化就行了,组合实现
    self.fish = Fish(y)
  def print_num(self):
    print("水池中总共有乌龟%d只,小鱼%r条。"%(self.turtle.num,self.fish.num)
>>> p =Pool(1,10)
>>>p.print_num ()
水池中总共有乌龟1只,小鱼10条

这就是组合,组合就是把类的实例化放到一个新类里面,他就把旧类组合进去了。

组合一般就是说把几个不是有继承关系的、没有直线关系的几个类放在一起,如果要实现纵向关系的几个类,就是继承。

2.类、类对象、实例对象

Python面向对象之类和对象实例详解

>>>class C(): #类,当类写完后就变成了类对象
    def x(self):
       print("xaaa")
>>> c =C()  #c是实例对象,C()是类对象
>>> c.x()
xaaa
>>> c.x= 1  #实例对象初始化一个变量
>>> c.x
1
>>> c.x()  #就不能继续调用原来的方法了,同名会覆盖掉类的方法
Traceback (most recent call last):
 File"<pyshell#18>", line 1, in <module>
  c.x()
TypeError: 'int' object is not callable

所以:不要试图在一个类里面定义所有的属性和方法,应该利用继承和组合机制;

用不同的词性命名,如属性名用名词,方法名用动词。

3.什么是绑定?

python严格要求方法需要有实例才能被调用,这种限制其实就是绑定。

>>>class CC:     #类
    def setxy(self,x,y):
       self.x = x
       self.y = y
    def printxy(self):
       print(self.x,self.y)
>>> dd= CC()   #实例对象,类对象
>>>dd.__dict__  #查看实例对象所拥有的属性
{}
>>>CC.__dict__  #查看类对象所拥有的属性
mappingproxy({'setxy':<function CC.setxy at 0x00000000031F9B70>, 'printxy': <functionCC.printxy at 0x00000000031F9BF8>, '__module__': '__main__', '__weakref__':<attribute '__weakref__' of 'CC' objects>, '__dict__': <attribute '__dict__'of 'CC' objects>, '__doc__': None})
>>>dd.setxy (4,5)  #实例对象中传入x,y
>>>dd.__dict__  #实例对象就有属性了,这两个属性紧属于实例对象的,类对象中是没有的
{'y': 5, 'x': 4}     #类对象中是没有实例对象传入的,这归功与绑定这个功能,self

为什么实例对象调用方法后类对象中没有实例对象的属性?

实例对象调用方法时,dd.setxy(dd,4,5) 实际上是这样的,也就是(self.x = x;self.y = y)dd.x=4,dd.y=5,那么4,5存放在实例对象的空间,故这两个属性只属于实例对象的。(实例对象调用类方法时,先把自己传给self,self.x也就是dd.x.)

类对象与实例对象差别:

把类对象CC删除后,del CC,再实例化就会报错,但是已经实例化对象dd仍然可以调用类对象中的方法:

>>> delCC
>>>dd.setxy (3,4)
>>>dd.__dict__
{'y': 4, 'x': 3}
>>> dd =CC()
Traceback (most recent call last):
 File"<pyshell#45>", line 1, in <module>
  dd =CC()
NameError: name 'CC' is not defined
>>>dd.printxy ()
3 4

为什么已经实例化对象dd仍然可以调用类对象中的方法?

类中定义的属性是静态变量,方法也一样,就算类对象被删除了,属性和方法一样存放在内存中,故实例对象仍然可以从内存中调用类的方法和属性,除非程序退出。所以创建一个类后最好先实例化再使用类对象中的方法,不要直接利用类对象调用方法。

self.x  self相当于实例对象的名字,.x就是实例的空间了

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
Apr 25 Python
Python操作Word批量生成文章的方法
Jul 28 Python
详细解读Python中解析XML数据的方法
Oct 15 Python
Linux 下 Python 实现按任意键退出的实现方法
Sep 25 Python
Python中第三方库Requests库的高级用法详解
Mar 12 Python
python操作excel的包(openpyxl、xlsxwriter)
Jun 11 Python
Python函数装饰器实现方法详解
Dec 22 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
Aug 06 Python
pytorch numpy list类型之间的相互转换实例
Aug 18 Python
pygame实现俄罗斯方块游戏(AI篇1)
Oct 29 Python
利用python中的matplotlib打印混淆矩阵实例
Jun 16 Python
Python基于httpx模块实现发送请求
Jul 07 Python
详解Django-auth-ldap 配置方法
Dec 10 #Python
Python网页正文转换语音文件的操作方法
Dec 09 #Python
python 使用 requests 模块发送http请求 的方法
Dec 09 #Python
Python实现八皇后问题示例代码
Dec 09 #Python
python中的tcp示例详解
Dec 09 #Python
python数据处理 根据颜色对图片进行分类的方法
Dec 08 #Python
Python发送邮件测试报告操作实例详解
Dec 08 #Python
You might like
动漫定律:眯眯眼都是怪物!这些角色狠话不多~
2020/03/03 日漫
锁定年轻人的双倍活力 星巴克推出星倍醇即饮浓咖啡
2021/03/03 咖啡文化
PHP mkdir()无写权限的问题解决方法
2014/06/19 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
php分页查询的简单实现代码
2017/03/14 PHP
jQuery源码分析之Event事件分析
2010/06/07 Javascript
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
Jquery 一次处理多个ajax请求的代码
2011/09/02 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
JavaScript导出Excel实例详解
2014/11/25 Javascript
JavaScript将字符串转换成字符编码列表的方法
2015/03/19 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
2017/03/24 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
2018/09/28 Javascript
对angularJs中自定义指令replace的属性详解
2018/10/09 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
2020/07/26 Javascript
js数组的基本使用总结
2021/01/18 Javascript
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
详谈python read readline readlines的区别
2017/09/22 Python
vscode 远程调试python的方法
2017/12/01 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
2019/02/21 Python
python之mock模块基本使用方法详解
2019/06/27 Python
python自动化测试之如何解析excel文件
2019/06/27 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
Python自动重新加载模块详解(autoreload module)
2020/04/01 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
2020/07/31 Python
Python中random模块常用方法的使用教程
2020/10/04 Python
公司部门司机岗位职责
2014/01/03 职场文书
装修致歉信
2014/01/15 职场文书
高中军训感想800字
2014/02/23 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
2014年销售员工作总结
2014/12/01 职场文书
计生个人工作总结
2015/02/28 职场文书
烈士陵园扫墓感想
2015/08/07 职场文书
这样写python注释让代码更加的优雅
2021/06/02 Python
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python