灿灿灿的第十二次python记录——面向对象程序设计,类与对象以及方法的定义

一、面向对象程序设计

一)

¥面向对象程序设计(Object Oriented Programming,OOP)主要针对大型软件设计而提出,使得软件设计更加灵活,能够很好地支持代码复用和设计复用,并且使得代码具有更好的可读性和可扩展性。
¥面向对象程序设计的一条基本原则是计算机程序由多个能够起到子程序作用的单元或对象组合而成,这大大地降低了软件开发的难度。
¥Python完全采用了面向对象程序设计的思想,是真正面向对象的高级动态编程语言,完全支持面向对象的基本功能,如封装、继承、多态以及对基类方法的覆盖或重写。
¥Python中对象的概念很广泛,Python中的一切内容都可以称为对象,除了数字、字符串、列表、元组、字典、集合、range对象、zip对象等等,函数也是对象,类也是对象。

二)面向对象的思想概述

¥程序员从面向过程的执行者转化成了面向对象的指挥者

¥面向对象分析方法分析问题的思路和步骤:
1.根据问题需要,选择问题所针对的现实世界中的实体。
2.从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类。
3.把抽象的实体用计算机语言进行描述,形成计算机世界中类的定义。即借助某种程序 语言,把类构造成计算机能够识别和处理的数据结构。
4.将类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具。

类与对象的定义

¥对象:将数据以及对数据的操作封装在一起,组成一个相互依存、不可分割的整体。
¥类:对于相同类型的对象进行分类、抽象后,得出共同的特征而形成了类。
¥面向对象程序设计的关键就是如何合理地定义和组织这些类以及类之间的关系。

二、类定义语法

一)

Python使用class关键字来定义类,class关键字之后是一个空格,然后是类的名字,再然后是一个冒号,最后换行并定义类的内部实现。
例子:

class Person:
     def __init__(self):
          self.name="韩信"
          self.gender='男'
          self.weight=70
          print("An instance created")
     def speak(self):
          print("hello")
#类的实例化
p=Person()
print(p.name)#访问数据成员
p.speak()  #访问成员方法

二)self参数

¥类的所有实例方法都必须至少有一个名为self的参数,并且必须是方法的第一个形参(如果有多个形参的话),self参数代表将来要创建的对象本身。
¥在类的实例方法中访问实例属性时需要以self为前缀。
¥在外部通过对象调用对象方法时并不需要传递这个参数,如果在外部通过类调用对象方法则需要显式为self参数传值。

三)类成员与实例成员

¥属于实例的数据成员一般是指在构造函数__init__()中定义的,定义和使用时必须以self作为前缀;属于类的数据成员是在类中所有方法之外定义的。
¥在主程序中(或类的外部),实例属性属于实例(对象),只能通过对象名访问;而类属性属于类,可以通过类名或对象名都可以访问。
¥在实例方法中可以调用该实例的其他方法,也可以访问类属性以及实例属性。
¥在Python中比较特殊的是,可以动态地为自定义类和对象增加或删除成员,这一点是和很多面向对象程序设计语言不同的,也是Python动态类型特点的一种重要体现

四)私有成员与公有成员

¥Python并没有对私有成员提供严格的访问保护机制。
1.在定义类的成员时,如果成员名以两个下划线“__”或更多下划线开头而不以两个或更多下划线结束则表示是私有成员。
2.私有成员在类的外部不能直接访问,需要通过调用对象的公有成员方法来访问,也可以通过Python支持的特殊方式来访问。
¥公有成员既可以在类的内部进行访问,也可以在外部程序中使用。
例子演示:

>>> class A:
	    def __init__(self, value1 = 0, value2 = 0):
		self._value1 = value1
		self.__value2 = value2
	    def setValue(self, value1, value2):
		self._value1 = value1
		self.__value2 = value2
	    def show(self):
		print(self._value1)
		print(self.__value2)

>>> a = A()
>>> a._value1
0
>>> a._A__value2             #在外部访问对象的私有数据成员
0

注意!!在Python中,以下划线开头的变量名和方法名有特殊的含义,尤其是在类的定义中。
_xxx:受保护成员,不能用’from module import *'导入;
__ xxx __:系统定义的特殊成员;
__xxx:私有成员,只有类对象自己能访问,子类对象不能直接访问到这个成员,但在对象外部可以通过“对象名._类名__xxx”这样的特殊方式来访问。
注意:Python中不存在严格意义上的私有成员。

三、方法

¥在类中定义的方法可以粗略分为四大类:公有方法、私有方法、静态方法和类方法。
1.私有方法的名字以两个下划线“__”开始,每个对象都有自己的公有方法和私有方法,在这两类方法中可以访问属于类和对象的成员;
2.公有方法通过对象名直接调用,私有方法不能通过对象名直接调用,只能在属于对象的方法中通过self调用或在外部通过Python支持的特殊方式来调用。
3.如果通过类名来调用属于对象的公有方法,需要显式为该方法的self参数传递一个对象名,用来明确指定访问哪个对象的数据成员。
4.静态方法和类方法都可以通过类名和对象名调用,但不能直接访问属于对象的成员,只能访问属于类的成员。
5.静态方法可以没有参数。
6.一般将cls作为类方法的第一个参数名称,但也可以使用其他的名字作为参数,并且在调用类方法时不需要为该参数传递值。
例子演示:

>>> class Root:
    __total = 0
    def __init__(self, v):    #构造方法
        self.__value = v
        Root.__total += 1

    def show(self):           #普通实例方法
        print('self.__value:', self.__value)
        print('Root.__total:', Root.__total)

    @classmethod              #修饰器,声明类方法
    def classShowTotal(cls):  #类方法
        print(cls.__total)

    @staticmethod             #修饰器,声明静态方法
    def staticShowTotal():    #静态方法
        print(Root.__total)
>>> r = Root(3)
>>> r.classShowTotal()              #通过对象来调用类方法
1
>>> r.staticShowTotal()             #通过对象来调用静态方法
1
>>> r.show()
self.__value: 3
Root.__total: 1
>>> rr = Root(5)
>>> Root.classShowTotal()           #通过类名调用类方法
2
>>> Root.staticShowTotal()          #通过类名调用静态方法
2
>>> Root.show()    #试图通过类名直接调用实例方法,失败
TypeError: unbound method show() must be called with Root instance as first argument (got nothing instead)
>>> Root.show(r)   #但是可以通过这种方法来调用方法并访问实例成员
self.__value: 3
Root.__total: 2
>>> Root.show(rr)  #通过类名调用实例方法时为self参数显式传递对象名
self.__value: 5
Root.__total: 2

3.1 python类的静态方法和类方法区别

1.类方法用在模拟java定义多个构造函数
这是由于python类中只能有一个初始化方法,不能按照不同的情况初始化类。
2.类中静态方法方法调用静态方法的情况。
一个静态方法调用另一个静态方法,如果改用类方法调用静态方法,可以让cls代替类,让代码看起来精简一些。也防止类名修改了,不用在类定义中修改原来的类名。
3.继承类中的区别
如果子类继承父类的方法,子类覆盖了父类的静态方法,子类的实例继承了父类的static_method静态方法,并调用该方法,还是调用的父类的方法和类属性。如果子类的实例继承了父类的class_method类方法,调用该方法,调用的是子类的方法和子类的类属性。

四、总结

上图!在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值