继续复习Python,今日复习 —— 面向对象程序设计,中间会有自己的心得体会,要是有什么错误或者补充可直接评论或者私信哟。
面向对象程序设计
面向对象程序设计
面向对象程序设计的思想主要针对大型软件设计提出,能够很好的支持代码复用和设计复用,并使得代码有很多好的可读性和扩展性,这点与Java是相同的,起到了封装的作用。对于相同类型的对象进行分类、抽象后,得出共同特征而形成了类,面向对象程序设计的关键就是如何合理的定义和组织这些类以及类之间的关系。
Python的面向对象程序设计中也有分装,继承,多态,重写等。但不同的是,Python中对象的概念很广泛,Python中一切内容都可以称为对象,而不一定是某个对象的实例。
刚开始我学这方面知识的时候,说实话是抵触的,因为我感觉不需要用到这方面的东西,但在学习多线程和自己尝试着开发一点小项目的时候,发现这是必不可少的东西,自己也曾再学习过这个知识,但一致是我自己的软肋,这次再次好好复习!
1. 类的定义与使用
1.1 类定义语法
class 关键字来定义类;类名的首字母一把要大写。
# 定义类,新式类必须至少有一个基类
class Car:
def infor(self):
print('This is a car')
定义了类之后,可以用来实例化对象,并通过“对象名.成员”的方式来访问其中的数据成员或成员方法:
# 这点和Java是类似的,但实例化的时候少了关键字 New
car = Car()
car.infor()
This is a car
可以使用内置方法 isinstance() 方法来测试一个对象是否为某个对象的实例:
isinstance(car,Car)
True
关键字 pass ,类似于空语句,当暂时没有确定如何实现功能,或者为以后的软件升级预留空间时,可以使用次关键字来“占位”:
class A:
pass
1.2 self 参数
类的所有实例方法都必须至少有一个名为 self 的参数,并且必须时方法的第一个形参,self 参数代表对象本身。在类的实例方法中访问实例属性时需要以 self 为前缀,但在外部通过对象名调用对象方法时并不需要传递这个参数,如果在外部通过类名调用对象方法则需显式为 self 参数传值。
class A:
def __init__(self,v):
self.v = v
def show(self):
print(self.v)
a = A(3)
a.show()
3
1.3 类成员与实例成员
(1)实例属性。一般指在构造函数 init() 中定义的,定义和使用时必须以 self 为前缀。
(2)类属性。是在类中所有方法之外定义的数据成员。
在主程序(或类的外部),实例属性属于实例(对象),只能通过对象名访问;而类属性属于类,可以通过类名或对象名访问。
Python比较特殊的是,可以动态的为类和对象增加成员,这一点是和其它的程序设计语言是不同的。Python动态型特点的一种体现。
class Car:
price = 1000
def __init__(self,c):
self.color = c
car_1 = Car('red')
car_2 = Car('blue')
print(car_1.color,Car.price)
Car.price = 2000
# 增加类属性
Car.name = 'QQ'
# 修改实例属性
car_1.color = 'pick'
# 创建方法
def setSpeed(self,s):
self.speed = s
1.4 私有成员与公有成员
Python并没有严格对私有成员提供严格的访问保护机制。
私有属性:属性名前以两个下划线开头‘__’(中间无空格)开头则表示私有属性。其在类的外部不能直接访问,需要通过调用对象的公有成员方法来访问。
注意:
class A:
def __init__(self,value_1=0,value_2=0):
self._value_1 = value_1
self.__value_2 = value_2
def setValue(self,value_1,value_2):
self._value_1 = value_1
self.__value_2 = value_2
2. 方法
(1)公有方法。属于对象。通过方法名直接调用。
(2)私有方法。属于对象。其名字以两个下划线‘__’开始。只能在属性方法中通过 self 调用或在外部通过Python支持的特殊方法调用。
(3)静态方法。
(4)类方法。
class Root:
_tatal = 0
def __init__(self,v):
self._value = v
self._tatal += 1
# 类方法
@classmethod
def A():
pass
# 静态方法
@staticmethod
def B():
pass
3. 特殊方法与运算符重载
Python类中有大量的特殊方法,其中比较常见的是构造函数和析构函数。
(1)构造函数。init() ,一般用来为数据成员设置处置或进行其他必要的初始化工作,在创建对象时被自动调用和执行,可以通过构造函数定义默认值参数来实现类似于其它语言中构造函数重载的目的。
(2)析构函数。del(),一般用来释放对象占用的资源,在Python删除对象和回收空间时被自动调用和执行。
4. 继承机制
继承是为了代码复用和设计复杂而设计的,时面向对象设计的重要特性之一,这与Java中继承的思想一致。在继承关系中,已有的、设计好的类称之为父类,新设计的类称为字类或派生类。派生类可以继承父类的公有成员,但不能继承私有成员。如果需要在派生类中调用基类的方法,可以使用内置函数的 super() 或者通过“基类名.方法名()”的方法来实现。
首先设计Person类,再以Person类为基类派生Teacher类,分别创建person类和Teacher类的对象,并在派生类中调用基类的方法:
# 在创建类的时候默认继承 类的基类 object
class Person(object):
def __init__(self,name='',age=20,sex='main'):
self.setName(name)
self.setAge(age)
self.setSex(sex)
def setName(self,name):
if not isinstance(name,str):
print('name must be string')
return
self._name = name
def setAge(self,age):
if not isinstance(age,int):
print('age must be int')
return
self._age = age
def setSex(self,sex):
if sex != 'man' and sex != 'woman':
print('sex muest be "man" or "woman"')
return
self._sex = sex
# 继承 Person 类
class Teacher(Person):
def __init__(self,name='',age=30,sex='man',department='Computer'):
# 使用父类的方法
super(Teacher,self).__init__(name,age,sex)
sef.setDepartment(department)
哎,感觉还是需要大量的练习取熟悉哇!加油!