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中文乱码的解决方法
Nov 04 Python
Python解析网页源代码中的115网盘链接实例
Sep 30 Python
简单的Python抓taobao图片爬虫
Oct 26 Python
Python实现带百分比的进度条
Jun 28 Python
Python操作Excel之xlsx文件
Mar 24 Python
详细解读tornado协程(coroutine)原理
Jan 15 Python
Python面向对象基础入门之编码细节与注意事项
Dec 11 Python
python实现点击按钮修改数据的方法
Jul 17 Python
django ModelForm修改显示缩略图 imagefield类型的实例
Jul 28 Python
解决Python中回文数和质数的问题
Nov 24 Python
详解opencv中画圆circle函数和椭圆ellipse函数
Dec 27 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 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
fgetcvs在linux的问题
2012/01/15 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
php多文件上传实现代码
2014/02/20 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
2016/07/06 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
利用jQuery的deferred对象实现异步按顺序加载JS文件
2013/03/17 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
jquery遍历数组与筛选数组的方法
2013/11/05 Javascript
探索angularjs+requirejs全面实现按需加载的套路
2016/02/26 Javascript
轮播的简单实现方法
2016/07/28 Javascript
JS判断是否在微信浏览器打开的简单实例(推荐)
2016/08/24 Javascript
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
总结javascript三元运算符知识点
2018/09/28 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
基于PHP pthreads实现多线程代码实例
2020/06/24 Javascript
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
python requests使用socks5的例子
2019/07/25 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
2020/04/18 Python
Django对models里的objects的使用详解
2019/08/17 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
使用python实现微信小程序自动签到功能
2020/04/27 Python
使用数据结构给女朋友写个Html5走迷宫游戏
2019/11/26 HTML / CSS
乌克兰机票、铁路和巴士票、酒店搜索、保险:Tickets.ua
2020/01/11 全球购物
市政施工员自我鉴定
2014/01/15 职场文书
2015年幼儿园毕业感言
2014/02/12 职场文书
体育教师个人的自我评价
2014/02/16 职场文书
物业保安员岗位职责
2014/03/14 职场文书
《数星星的孩子》教学反思
2014/04/11 职场文书
青安岗事迹材料
2014/05/14 职场文书
公司离职证明样本
2014/09/13 职场文书
聊聊JS ES6中的解构
2021/04/29 Javascript
SQL Server表分区删除详情
2021/10/16 SQL Server