Python 面向对象:类的创建及其基本内置方法的使用

首先了解一下什么是面向对象

  • 面向过程:
    就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
    例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。
  • 面向对象
    是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
    面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为 1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的i变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

1 类的建立及对象的创建

在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。编写类时,你定义一大类对象都有的通用行为。基于类创建对象 时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。

  • 要设计一个类,通常要满足三个要求:

    • 类名:这类事物的总称,满足大驼峰命名法
    • 属性:这类事物所具有的特征
    • 方法:这类事物具有什么样的行为

1.1 简单的类的定义

 定义简单的类:class 类名:def 方法一(self,参数列表):passdef 方法二(self,参数列表):pass

示例:定义一个动物类,动物一般都能吃喝跑睡

 class Animal():        # 类名称def drunk(self):    # 方法passdef eat(self):      # 方法passdef run(self):      # 方法passdef sleep(self):    # 方法pass

执行如下:

1.2 属性的添加及调用

类中必定包含此类的特点,也就是所谓的属性,此时要调用一个内置方法_ init _(self)

借用上一个动物的例子,基本的每个动物都有姓名和年龄,这就是其属性
示例如下:

 class Animal():def __init__(self,name,age):     # 初始化属性 name 和 age  self.name = nameself.age = agedef drunk(self):print '%s 要喝水' % self.namedef eat(self):print '%s 要吃饭' % self.namedef run(self):print '%s 要跑步' % self.namedef sleep(self):print '%s 要睡觉' % self.namecat = Animal('cat',2)        # 通过类来创建实例cat.run()                    # 调用类中的方法cat.drunk()cat.eat()cat.sleep()===========================================================================================其中:1. def __init__(self,name,age):self.name = nameself.age = age两个变量都有前缀 self 。以 self 为前缀的变量都可供类中的所有方法使用,我们还可以通过类的任何实例来访问这些变量。 self.name = name 获取存储在形参 name 中的值,并将其存储到变量 name 中,然后该变量被关联到当前创建的实例。 self.age = age 的作用与此类似。像这样可通过实例访问的变量称为属性 。2. cat = Animal('cat',2)通过对象名 = 类名(实参) 的形式来创建实例,类在进行实例化之前系统是不会给其分配内存空间的3. cat.run()类中方法的调用,是通过 实例.方法名称 进行调用的

执行如下:

控制台显示如下:

2. 方法

类中的函数称为方法 ;你前面学到的有关函数的一切都适用于方法,就目前而言,唯一重要的差别是调用方法的方式。

上面对类的建立中使用了一个基本的内置方法 _ init _(self),下面就介绍一下几种常用的内置方法

2.1 _ init _ ()初始化方法

  • 当使用类名( )创建对象时,python的解释器会自动执行以下操作

    • 为对象在内存中分配空间–创建对象
    • 调用初始化方法为对象的属性设置初始值–初始化方法(_ init ),这个初始化方法就是: init _ 方法, _ init _ 是对象的内置方法, _ init _ 方法时专门用来定义一个类具有哪些属性的方法

示例:定义一个动物类,动物一般都有名称年龄

 class Animal():   # 定义一个类def __init__(self,name,age):# 初始化方法来进行属性添加self.name = nameself.age = agedef attr(self):# 定义此方法,返回属性的值return self.name,self.agecat = Animal('cat',2)   # 建立实例print cat.attr()     # 调用实例方法来进行显示返回属性的值

执行如下:

控制台结果如下:

2.2 _ del _()方法

当删除一个对象时,python解释器会默认调用一个方法,这个方法为_ del _ ()方法。在python中,对于开发者来说很少会直接销毁对象(如果需要,应该使用del关键字销毁)。Python的内存管理机制能够很好的胜任这份工作。也就是说,不管是手动调用 del 还是由 python自动回收都会触发 _ del _ 方法执行:

示例:

 class Animal(object):# 初始化方法# 创建完对象后会自动被调用def __init__(self, name):print('__init__方法被调用')self.name = name# 析构方法# 当对象被删除时,会自动被调用def __del__(self):print("__del__方法被调用")print("%s对象马上被干掉了..." % self.name)# 创建对象dog = Animal("哈皮狗")# 删除对象,__del__ 方法被调用del dogcat = Animal("波斯猫")print '马上删除%s',cat.name    # 若不主动删除对象,会先执行此命令,再调用__del__命令

执行如下:

控制台显示如下:

2.3 _ str _()方法

在 python 中,使用 python 输出对象变量,
默认情况下,会输出这个变量引用的对象是由哪一个类创建的以及在内存中的地址(十六进制表示)
如果在开发中,希望使用print输出对象变量时,
能够打印自定义的内容,就可以利用_ str 这个内置方法了
需要通过 return 来返回所要输出的字符串

示例:不使用 _ str _ 方法之前

 class Animal():# 初始化方法# 创建完对象后会自动被调用def __init__(self, name):print('__init__方法被调用')  self.name = name# 建立对象cat = Animal('Tom')print cat   # 直接显示实例,返回的是实例指向的内存地址

执行如下:

控制台显示如下:

示例:使用 _ str _ 方法之后

 class Animal():# 初始化方法# 创建完对象后会自动被调用def __init__(self, name):print('__init__方法被调用')self.name = namedef __str__(self):return '返回 %s' % self.namecat = Animal('Tom')print cat

执行如下:

控制台显示:

2.4 _ new _()方法(单例)

在进行 _ new _ 方法的介绍之前先介绍一个概念:新式类与旧式类

  • Python中类分两种:旧式类和新式类:
    新式类,旧式类(经典类)
    新式类 定义时给类后加上(object)
    class A(object)
    pass
    python 3 以后若是未指定继承自object 会默认继承自 object 类
    python 3 以前则不会,需要进行指定
    可通过 dir()函数,来查看对象可调用的类的方法

示例:新式类

 class A(object):passa = A() # 通过print来查看print dir(a)旧式类示例:class B:passb = B() print dir(b) 

执行如下:

控制台显示如下:

注:新式类旧式类最明显的区别在于继承搜索的顺序发生了改变
即:
经典类多继承搜索顺序(深度优先):
先深入继承树左侧查找,然后再返回,开始查找右侧
新式类多继承搜索顺序(广度优先):
先在水平方向查找,然后再向上查找。
此种区别会在面向对象特点——继承中介绍到

下面介绍 _ new _ 方法

_ new _ ()是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在Python 中 存在于类里面的构造方法 _ init _ () 负责将类的实例化,而在 _ init _ ()启动之前, _ new _ ()决定是否 要使用该 _ init _ ()方法,因为_ new _ ()可以调用其他类的构造方法或者直接返回别的对象来作为本类 的实例。
如果将类比喻为工厂,那么_ init _ ()方法则是该工厂的生产工人,_ init _ ()方法接受的初始化参数则是生产所需原料,_ init _ ()方法会按照方法中的语句负责将原料加工成实例以供工厂出货。而 _ new _ ()则是生产部经理,_ new _ ()方法可以决定是否将原料提供给该生产部工人,同时它还决定着出货产品是否为该生产部的产品,因为这名经理可以借该工厂的名义向客户出售完全不是该工厂的产品。
_ new _ ()方法的特性:
_ new _ ()方法是在类准备将自身实例化时调用。
_ new _ ()方法始终都是类的静态方法,即使没有被加上静态方法装饰器。
静态方法在下面会讲到

_ new _ () 最经典的作用,实现单例

单例:单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例

示例:

 class MusicPlayer(object):instance = Nonedef __new__(cls, *args, **kwargs):# 第一个参数cls:哪一类调用,就传递哪一类# 第二个参数 *args:多值参数# 第三个参数 **kwargs:多值的字典参数# 创建对象的时候,new方法会被自动调用# 重写了父类的方法if  cls.instance is None:cls.instance = object.__new__(cls)return cls.instanceplayer1 = MusicPlayer()print player1player2 = MusicPlayer()print player2

执行如下:

控制台显示如下:

由控制台显示可知,实例 player1 player2所返回的内存地址相同,故为本质上为同一实例

3 几种特殊属性及方法(类属性,类方法,静态方法,私有属性,私有方法)

3.1 私有属性,私有方法

如果一个属性是以两个下划线开始 就标识这个这个属性是一个私有属性
如果一个自定义方法是以两个下划线开始 就标识这个这个方法是一个私有方法
私有属性私有方法都不能直接访问

示例:私有属性

 class Animal(object):def __init__(self, name, age):self.name = nameself.__age = age   # 定义私有属性cat = Animal('cat',2)print cat.nameprint cat.__age   # 在外部调用私有属性会显示该类没有此属性

执行如下:

控制台显示如下:

可在类的内部调用私有属性:
执行如下:

控制台显示如下:

示例:私有方法

 class Animal(object):def __init__(self, name, age):self.name = nameself.__age = age  # 定义私有属性 def __test(self):   # 定义私有方法print '这是私有方法' cat = Animal('cat', 2)cat.__test()    # 在外对私有方法进行调用

执行如下:

控制台显示如下:

想要对私有方法进行调用,可以在类中定义公有方法,通过公有方法间接调用私有方法
示例:

 class Animal(object):def __init__(self, name, age):self.name = nameself.__age = age  # 定义私有属性def __test(self):   # 定义私有方法print '这是私有方法'def test(self):print '这是公有方法,通过此方法调用私有方法'Animal.__test(self)cat = Animal('cat', 2)cat.test()

执行如下:

控制台显示如下:

3.2 类属性,类方法

  • 类是一个特殊的对象
    Python中一切皆对象
    class AAA: 定义的类属性属于类对象
    obj1 = AAA:属于实例对象
    在运行程序时,类 同样会被加载到内存

类对象可以有自己属性和方法
通过 类名. 的方式可以直接访问类的属性或者调用类的方法

3.2.1 类属性

  • 类属性是针对类对象定义的属性
    使用复制语句在class关键字下方可以定义类属性
    类属性用于记录这个类相关的特性

示例:

 class Tool():count = 0# 使用赋值语句定义类的属性,记录所有的工具的数量def __init__(self,name):self.name = nameTool.count += 1# 让类的属性加1# 创建工具对象(对象在创建的时候,会自动调用初始化方法)tool1 = Tool('锄头')tool2 = Tool('斧头')# 输出工具对象的总数# 使用 ‘类名.属性名’ 来获取print Tool.count

执行如下:

控制台显示如下:

3.2.2 类方法

  • 类方法就是针对类对象定义的方法
    在类方法内部就可以直接访问类属性或者调用其他类方法
  • 语法如下:
    @classmethod
    def 类方法(cls)
    pass

示例:

 class Car(object):# 定义类属性count = 0 @classmethoddef show_car_count(cls):# cls.count:在类方法内部访问类属性print '汽车对象的数量为 %s' % cls.countdef __init__(self,name):self.name = nameCar.count += 1# 创建car对象car1 = Car('Bwm')car2 = Car('Benci')car3 = Car('Toyota')# 调用类方法Car.show_car_count()

执行如下:

控制台显示如下:

3.2.3 静态方法

静态方法

  • 静态方法
    在开发时,如果需要在类中封装一个方法,这个方法:
    即不需要访问实例属性或者调用实例方法
    也不需要访问类属性或者调用类方法
    这时可以把这个方法封装成一个静态方法
  • 语法如下:
    @staticmethod
    def 静态方法():
    pass

示例:

 class Car(object):@staticmethoddef tool():# 静态方法不需要传递第一个参数:selfprint 'By car to school is too convinent!'# 通过类名,调用静态方法# 不需要创建对象,直接可以调用Car.tool()

执行如下:

控制台显示如下:

4. 以上几种的对比

4.1 类对象和实例对象的区别

类对象就是类本身,当遇见类的时候,就会创建新的命名空间,命名空间

包含所有类变量和方法定义的名称。

实例对象就是通过类对象创建出来的实例(类对象实例化之后返回的

就是实例对象),用来存储实例属性和存储实例对象的引用。

4.2 类属性和实例属性的区别

类属性:定义在类内部,方法外边,属于所有类对象和所有实例对象

调用:类对象.属性 = 值

实例属性:通过init初始化的变量和实例对象创建出来的属性

调用:实例对象.属性

4.3 类方法和实例方法和静态方法的区别

类方法:必须有一个参数,这个参数表示为当前类对象,一般为cls,在

方法的头部加上@classmethod

实例方法:必须有一个参数,表示当前实例对象,一般是self

静态方法:普通函数的格式,不需要强制要求传递参数,在方法的头部

加上注释@staticmethod一般用于实例对象、类对象无关的

Python 入门 —— Python 面向对象:类的创建及其基本内置方法的使用相关推荐

  1. Python入门学习-DAY27- isinstance与issubclass、反射、内置方法

    isinstance与issubclass issubclass:判断子类是否属于父类,是则返回True,否则返回False isinstance:判断对象是否属于类,是则返回True,否则返回Fal ...

  2. python基础30个常用代码大全-Python3列表内置方法大全及示例代码小结

    Python中的列表是简直可说是有容乃大,虽然看似类似C中的数组,但是Python列表可以接受任意的对象元素,比如,字符串,数字,布尔值,甚至列表,字典等等,自由度提升到一个新的高度,而Python也 ...

  3. 关于学习Python的一点学习总结(33->继承中内置方法及多继承)

    73.继承中的一些内置方法: 1. issubclass(类1,类2):判断一个类是不是另一个类的子类: 2. 类名. _ bases _ :访问一个类的特殊属性: 3. isinstance(对象, ...

  4. python类的内置方法_python面向对象之类中的内置方法

    __setattr__,__delattr__,__getattr__,__getattribute__以及标准类型的二次加工 __setattr__,__delattr__,__getattr__的 ...

  5. Python学习day07 - Python进阶(1) 内置方法

    Python学习day07-Python进阶(1)数据类型的内置方法一. 数字类型内置方法1. 整型内置方法1.1 作用1.2 定义方法1.3 内置方法1.4 存在一个还是多个值1.5 有序or无序1 ...

  6. python如何设计工具类_Python面向对象 --- 类的设计和常见的内置方法

    面向对象:一种基于面向过程的新的编程思想.也就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是对数据一种 ...

  7. python全栈开发基础【第十七篇】面向对象反射和内置方法

    一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...

  8. Python入门 Python自学路线 Python如何学习

    本文介绍Python入门 Python自学路线 Python如何学习.先说点题外话吧:首先呢,我刚开始接触编程的时候,学的是C,那时候Python还没有这么火,后来学了C++,PHP,Java,前端. ...

  9. python内置类属性_Python内置方法和属性应用:反射和单例(推荐)

    1. 前言 python除了丰富的第三方库外,本身也提供了一些内在的方法和底层的一些属性,大家比较常用的如dict.list.set.min.max.range.sorted等.笔者最近在做项目框架时 ...

最新文章

  1. 小心陷阱:二维动态内存的不连续性
  2. [Node.js]Restful Api
  3. libqrencode生成二维码图片的问题
  4. 2019江行智能 后端开发工程师Go 面试题
  5. MySql 数据操作类
  6. vm磁盘映射 不能启动_Oracle的启动与关闭-数据库(4)
  7. 如何快速通过全国计算机等级考试【二级三级】(干货文章)
  8. c#发送邮件,可发送多个附件
  9. 实现一个shell程序
  10. 30.Linux/Unix 系统编程手册(上) -- 线程:线程同步
  11. 360浏览器调试html5,360浏览器如何打开调试工具
  12. 必看 logit回归分析步骤汇总
  13. RO-data、RW-data、ZI-data的解释
  14. C++if嵌套语句判断闰年
  15. OSPF协议(NA、NP知识)
  16. 上周工作总结及本周工作安排
  17. 有个开发者总结这 15 优雅的 JavaScript 个技巧
  18. python 常数怎么表达_Python的常数类
  19. 利用pyecharts绘制水球图的案例
  20. OncoImmunity成为获得机器学习新抗原预测技术临床应用CE-IVD标记的首家公司

热门文章

  1. VMware Workstations 打开.vmx 虚拟机无反应问题
  2. [SPI+DMA] 驱动WS2812B显示时钟
  3. 微信加密数据解密报错-41003
  4. zb system login.php,zblog 修改后台登陆地址的教程
  5. 刚刚!霍金向北京喊话:人类需要大胆前行,涉足无前人所及之处
  6. Win10插了耳机电脑还是外放怎么办
  7. Debian虚拟机安装
  8. 森林安全守护者来了!
  9. 飞腾服务器代理上网设置
  10. CSS特效三:简单的便签效果