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 字符串中的字符倒转
Sep 06 Python
Python中的exec、eval使用实例
Sep 23 Python
Python 多线程的实例详解
Sep 07 Python
根据DataFrame某一列的值来选择具体的某一行方法
Jul 03 Python
对numpy中向量式三目运算符详解
Oct 31 Python
解决yum对python依赖版本问题
Jul 05 Python
Python3 使用selenium插件爬取苏宁商家联系电话
Dec 23 Python
浅谈Python中range与Numpy中arange的比较
Mar 11 Python
python实现控制台输出彩色字体
Apr 05 Python
Python虚拟环境virtualenv创建及使用过程图解
Dec 08 Python
PyCharm+Miniconda3安装配置教程详解
Feb 16 Python
Python机器学习三大件之一numpy
May 10 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
PHP下对数组进行排序的函数
2010/08/08 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
php防止站外远程提交表单的方法
2014/10/20 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
jQuery中将函数赋值给变量的调用方法
2012/03/23 Javascript
jquery常用方法及使用示例汇总
2014/11/08 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
2015/09/14 Javascript
微信小程序 开发之顶部导航栏实例代码
2017/02/23 Javascript
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
详谈innerHTML innerText的使用和区别
2017/08/18 Javascript
通过源码分析Vue的双向数据绑定详解
2017/09/24 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
Element Badge标记的使用方法
2020/07/27 Javascript
js动态生成表格(节点操作)
2021/01/12 Javascript
[01:37]PWL S2开团时刻DAY1&2——这符有毒
2020/11/20 DOTA
Python定义二叉树及4种遍历方法实例详解
2018/07/05 Python
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
Django框架HttpResponse对象用法实例分析
2019/11/01 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
关于TensorFlow新旧版本函数接口变化详解
2020/02/10 Python
基于logstash实现日志文件同步elasticsearch
2020/08/06 Python
python 制作网站小说下载器
2021/02/20 Python
html5页面结构_动力节点Java学院整理
2017/07/10 HTML / CSS
Puritan’s Pride(普丽普莱)官方网站:美国最大最全的保健品公司之一
2016/10/23 全球购物
茱莉蔻美国官网:Jurlique美国
2020/11/24 全球购物
养殖项目策划书范文
2014/01/13 职场文书
升旗仪式主持词
2014/03/19 职场文书
民政局标准版离婚协议书
2014/12/01 职场文书
2015年社区服务活动总结
2015/03/25 职场文书
幼儿园亲子活动通知
2015/04/24 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书
Java输出Hello World完美过程解析
2021/06/13 Java/Android
Log4j.properties配置及其使用
2021/08/02 Java/Android
MyBatis配置文件解析与MyBatis实例演示
2022/04/07 Java/Android