面向对象程序设计(一)
文章目录
一、类的定义与使用
1.1 类定义语法
- Python使用
class关键字
来定义类,class关键字之后是一个空格,然后是类的名字,再然后是一个冒号
,最后换行并定义类的内部实现。如:
class Car: #定义类
def infor(self): #成员方法
print("This is a car")
- 定义类之后,可以实例化对象,并通过“对象名.成员”的方式来访问其中的数据成员或成员方法
- 可以使用内置方法isinstance()来测试一个对象是否为某个对象的示例
- 关键字pass表示空语句,可以在类和函数的定义中或者选择结构、循环结构中
1.2 self参数
- 类的所有实例方法
必须至少有一个
名为self的参数,并且必须是方法的第一个
形参(如果有多个形参的话),self参数代表将来要创建的对象本身
。
在类的实例方法中访问实例属性时需要以self为前缀。
在外部通过对象调用对象
方法时并不需要
传递这个参数,如果在外部通过类
调用对象方法则需要
显式为self参数传值。
1.3 类成员与实例成员
这里主要指数据成员,或者广义上的属性,可以说属性有两种:一种是实例属性,一种是类属性
- 属于实例的数据成员一般是指在构造函数__init__()中定义的,定义和使用时必须以self作为前缀;属于类的数据成员是在类中所有方法之外定义的。
- 在主程序中(或类的外部),
实例属性属于实例(对象),只能通过对象名访问;而类属性属于类,可以通过类名或对象名都可以访问
。 - 在实例方法中可以调用该实例的其他方法,也可以访问类属性以及实例属性。
- 在Python中比较特殊的是,可以
动态地为自定义类和对象增加或删除成员
,这一点是和很多面向对象程序设计语言不同的,也是Python动态类型特点的一种重要体现
class Car:
price = 100000 #定义类属性
def __init__(self, c):
self.color = c #定义实例属性
car1 = Car("Red") #实例化对象
car2 = Car("Blue")
print(car1.color, Car.price) #查看实例属性和类属性的值
Car.price = 110000 #修改类属性
Car.name = 'QQ' #动态增加类属性
car1.color = "Yellow" #修改实例属性
#del Car.price #删除类属性
print(car2.color, Car.price, Car.name)
print(car1.color, Car.price, Car.name)
import types
def setSpeed(self, s):
self.speed = s
car1.setSpeed = types.MethodType(setSpeed, car1) #动态增加成员方法
car1.setSpeed(50) #调用成员方法
print(car1.speed)
1.4 私有成员与公有成员
- Python并没有对私有成员提供严格的访问保护机制。
1.4.1私有成员:
(1)在定义类的成员时,如果成员名以两个下划线
“__”或更多下划线开头而不以两个或更多下划线结束则表示是私有成员。
(2)私有成员````在类的外部不能直接访问,需要通过调用对象的公有成员方法来访问,也可以通过Python支持的
特殊方式```来访问。
1.4.2 公有成员
公有成员既可以在类的内部进行访问,也可以在外部程序中使用。
1.4.3 以下画线开头的变量名和方法名
在Python中,以下划线开头的变量名和方法名有特殊的含义,尤其是在类的定义中。
- _xxx:受保护成员,不能用’from module import *'导入;
- xxx:系统定义的特殊成员;
- __xxx:私有成员,只有类对象自己能访问,子类对象不能直接访问到这个成员,但在对象外部可以通过“对象名._类名__xxx”这样的特殊方式来访问。
注意:Python中不存在严格意义上的私有成员。
二、方法
- 在类中定义的方法可以粗略分为四大类:公有方法、私有方法、静态方法和类方法。
2.1私有方法
- 私有方法的名字以两个下划线“__”开始,每个对象都有自己的公有方法和私有方法,在这两类方法中可以访问属于类和对象的成员;
2.2公有方法
- 公有方法通过对象名直接调用,私有方法不能通过对象名直接调用,只能在属于对象的方法中通过self调用或在外部通过Python支持的特殊方式来调用。
如果通过类名来调用属于对象的公有方法,需要显式为该方法的self参数传递一个对象名,用来明确指定访问哪个对象的数据成员。
2.3静态方法
- 静态方法和类方法都可以通过类名和对象名调用,但不能直接访问属于对象的成员,只能访问属于类的成员。
- 静态方法可以没有参数。
2.4 类方法
- 一般将cls作为类方法的第一个参数名称,但也可以使用其他的名字作为参数,并且在调用类方法时不需要为该参数传递值。