面向对象编程是最有效的软件编写方法之一。
理解面向对象编程有助于你像程序员那样看世界,还可以帮助你明白自己编写的代码。了解类背后的概念可培养你的逻辑思维,让你能够通过编写程序来解决遇到的任何问题。
1.创建一个PP类
// 一个有关python类的代码
class PP:
""""一次创造PP的简单尝试"""
def __init__(self, name, year, sex):
"""初始化描述PP的属性"""
self.name = name
self.year = year
self.sex = sex
def get_descriptive_name(self):
"""返回描述性信息"""
long_name = self.name + '出生于' + str(self.year) + '年' + '性别是' + str(self.sex)
return long_name.title()
def sit(self):
"""命令PP坐下"""
print(self.name.title() + '坐下了')
依次解释上面的代码:
Python规定,首字母大写的名称指类。类定义中的括号是空的,我们要从空白创建PP类。
1.1 方法__init__()
类中的函数称为方法。这个方法由前后分别两个下划线及中间的init构成。这个方法每当你根据PP类创建新的实例(##根据类来创建对象称为实例化)时,python会自动运行它。
该方法包含四个形参,self, name, year, sex。其中,形参self必须存在且位于其他形参前面。self必须存在的原因是:Python调用__init__()方法创建实例时,会自动传入实参self,每个鱼类相关联的方法调用都会自动传递实参self,是一个指向实例本身的引用。所以我们在创建实例时,只需给self后的形参赋值。
self.name,self.year,self.sex他仨变量都有前缀self,以self为前缀的变量都可供类中的所有方法使用,你可以通过类中的任何实例访问self.xxx。
1.2 根据类创建实例
my_pp = PP('小文', 2000, '女')
print(my_pp.get_descriptive_name())
my_pp.sit()
1.3 如何访问属性
my_pp.name ##可以访问my_pp的属性name的值。(书言:句点表示法)
1.4 如何调用方法
my_pp.sit() ##根据类创建实例后,使用句点表示法来调用类中定义的方法。
2.使用类和实例
下面代码摘自《python编程从入门到实践》,懒得改了。
class Car:
""""一次模拟汽车的简单尝试"""
def __init__(self, make, model, year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
"""返回整洁的描述性信息"""
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
def read_odometer(self):
"""打印一条指出汽车里程的消息"""
print("This car has " + str(self.odometer_reading) + " miles on it")
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
##部分代码上文有所解释,此处不再重复解释。
2.1 给属性指定默认值
类中的每个属性必须有初始值。在方法中赋值,这样就方法的定义中就无需包含这个形参。
self.odometer_reading = 0 ##__init__()的形参中没有加入odometer_reading
方法read_odometer(self)用来读取属性self.odometer_reading,并打印。
2.2 修改属性的值
2.2.1 直接修改
my_new_car = Car('audi', 'a4', 2016)
my_new_car.odometer_reading = 23 ##修改了my_new_car.odometer_reading的值
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
2.2.2 通过方法修改属性的值
class Car():
--snip--
def update_odometer(self, mileage):
"""将里程表读数设置为指定的值"""
self.odometer_reading = mileage
my_new_car = Car('audi', 'a4', 2016)
my_new_car.update_odometer(23)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
都是明白人。
2.2.3 通过方法对属性的值进行递增
class Car():
--snip--
def increment_odometer(self, miles):
"""将里程表读数增加指定的量"""
self.odometer_reading += miles ##方法increment_odometer(self, miles)接受一个数字,并将其加到self.odometer_reading上。
my_new_car = Car('audi', 'a4', 2016)
my_new_car.update_odometer(200)
my_new_car.read_odometer()
my_new_car.increment_odometer(100)
my_new_car.read_odometer()