面向对象编程是最有效的软件编写方式之一,这一节我们来讲类和对象的相关概念。
在 python 中,我们可以使用 class
关键字来声明一个类,其中首字母需要大写:
class Dog:
# 类中的函数被称为方法,__init__()是一个特殊的方法,每当你根据Dog类创建新实例时,Python都会自动运行它。
# 在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突。
# 其中 self 参数是一个指向实例本身的引用,让实例能够访问类中的属性和方法,必不可少的参数。
def __init__(self, name, age):
self.name = name
self.age = age
def sit(self):
print(self.name.title() + " is now sitting.")
def roll_over(self):
print(self.name.title() + " rolled over!")
# 实例
my_dog = Dog('willie', 6)
my_dog.sit()
my_dog.roll_over()
创建实例的方法也很简单,直接传入相关实际参数就可以了。
my_dog = Dog('willie', 6)
我们看上面的例子,我们写的类是狗,我们写的方法也是狗都会的动作,比如 sit 和 roll_over,但是实际上狗也分为很多种,比如哈士奇,比如柴犬,当我们需要实例化一个哈士奇的时候,我们需要编写一个哈士奇的 class,那么哈士奇的 class 中实际上也是需要 sit 和 roll_over 的,因为这是狗都会的方法,那么我们是怎么操作呢,难道实在编写哈士奇这个 class 的时候重新写一遍这两个方法吗,包括属性,实际上每一只狗都有 name 和 age,我们是都需要在哈士奇这个 class 中重写吗?
实际上肯定是不需要的,这里就可以使用继承的方法来书写新的类。
class Dog:
# 类中的函数被称为方法,__init__()是一个特殊的方法,每当你根据Dog类创建新实例时,Python都会自动运行它。
# 在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突。
# 其中 self 参数是一个指向实例本身的引用,让实例能够访问类中的属性和方法,必不可少的参数。
def __init__(self, name, age):
self.name = name
self.age = age
def sit(self):
print(self.name.title() + " is now sitting.")
def roll_over(self):
print(self.name.title() + " rolled over!")
class Hashiqi(Dog):
def __init__(self, name, age, color):
# 注意,这里使用 super().__init__ 来继承父类的属性
super().__init__(name, age)
self.color = color
# 子类自然继承父类的方法,新的方法可以自己另写
def show_color(self):
print(self.name.title() + " is " + self.color)
my_dog = Hashiqi('willie', 6, 'black')
my_dog.sit()
my_dog.roll_over()
my_dog.show_color()
上面的这个例子中,我们这个新的 class Hashiqi ,实际上就继承了 Dog 这个类,通过这种方法,我们就不用再次书写同样的属性和方法,只需要继承即可,我们可以接着编写其他的狗的 class,只需要将共性的方法和属性都提取到 Dog 类中,然后继承即可。
和模块的导入是一样的,比如上面我们的 Dog 类如果单独放在一个叫做 dog.py 的文件中,这个时候,我们就需要在 Hashiqi 类的文件中引入:
form car import Car
我们之前讲了如何引入模块,如何引入类,那实际上 python 本身就实现了很多的方法,我们叫做 python 标准库,我们可以从标准库中引入很多实用的方法:
# 引入一个生成随机数的方法
form random import randint
正如最开始所说,面向对象编程是一种非常常用的编码方式。他也有一些规定,比如我们的类的开头必须大写,这一点我们已经这么做了,另外在 python 中,我们使用大驼峰的方式来命名类:
所以写到这里,我们可以看出上面的案例中命名其实是错误的,我们一直写的是 Hashiqi
,而实际上应该是 HaShiQi
。