###8、类
- 类的定义
在Python中,首字母大写的名称指的是类,一般采用驼峰命名法,即每个单词的首字母大写,但是字母之间不用下划线隔开。
类中必须包含方法_init_ ,类中的所有函数的形参列表第一个形参都必须是self。
class Dog:
def __init__(self,name,age=2):
self.name = name
self.age = age
def sit(self):
print(f"{self.name} is now sitting.")
def age(self):
print(f"{self.name} is {self.age} years old.")
-
方法_init_()
它是一个特殊的方法,每当我们根据Dog类创建行的实例时,Python都会自动运行它。在这个方法的名称中,开头和结尾各有两个下划线,这是一中约定,旨在避免Python默认方法与普通方法发生名称冲突。如果没有这两个下划线,当我们使用类创建实例时,将不会自动调用这个方法。
在_init_()中定义的两个变量都带有前缀self,以self为前缀的变量可供类中的所有方法使用,可以通过类的任何实例来访问。像这样可通过实例访问的变量称为属性。
在方法_init_()中我们也可以为形参指定默认值。 -
为什么每个内部函数都需要有形参self ?
因为Python调用_init_()创建实例时,将自动传入实参self。每个与实例相关联的方法调用都自动传递实参self,他是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
在类的内部函数中,使用任何类内部的变量和函数都需要通过self.来调用,否则会出现函数未定义或者变量未定义的错误。
class Test:
def __init__(self, n=3):
self.n = n
def add_one(self, n):
return n+1
def print_add_one (self):
result = self.add_one(self.n)
return f"the result is {result}"
if __name__ == "__main__":
tesr = Test(4)
print(tesr.print_add_one())
输出:
the result is 5
- 修改属性值
对于类的属性值,我们有三种方法可以修改:直接通过实例修改,通过方法进行设置,通过方法进行递增(增加特定的值)。
class Dog:
def __init__(self,name,age):
self.name = name
self.age = age
def increase_age_by_1(self):
self.age +=1
def change_name(name):
self.name = name
dog_1 = Dog('jim',1)
print(dog_1.name,dog_1.age)
#直接更改
dog_1.name = 'lucy'
print(dog_1.name,dog_1.age)
#通过内部方法更改
dog_1.increase_age_by_1()
print(dog_1.name,dog_1.age)
输出:
jim 1
lucy 1
lucy 2
在修改属性值的时候要非常小心,我们可以使用类似于上面的方法来控制用户修改属性值(不能让里程表的数值减小)的方式,但能够访问程序的人都可以通过直接访问属性来将里程表修改为任何值。要确保安全,除了进行类似与前面的基本检查外,还需要特别注意细节。
- 继承
一个类继承另一个类时,将自动获得另一个类的所有属性和方法。原有的类成为父类,而新类称为子类。子类继承了父类的所有属性和方法,同时还可以定义自己的属性和方法。
在既有类的基础上编写新类时,通常要调用父类的方法_init_()。这将初始化在父类_init()_方法中定义的所有属性,从而让子类包含这些属性。
class Pet:
def __init__(self,name,age):
self.name = name
self.age = age
def increase_age_by_1(self):
self.age +=1
def change_name(name):
self.name = name
class Dog(Pet):
def __init__(self,name,age,color):
super().__init__(name, age)
self.color = color
#定义自己的函数
def roll_over(self):
print(f"{self.name.title()} is roll over now")
#重写父类的函数
def change_name(self):
self.name += ' is a good name'
my_dog = Dog('dog','jim','black')
my_dog.roll_over()
my_dog.change_name()
print(my_dog.name)
my_dog.increase_age_by_1() #继承父类函数
print(my_dog.age)
输出:
Dog is roll over now
dog is a good name
2
super()是一个特殊函数,让我们能够调用父类的方法。父类也称为超级类(superclass),名称super由此而来。
在一个类继承另一个类之后,就可以添加区分自雷和父类所需的新属性和新方法了。
对于父类的方法,只要它不符合子类模拟的实物行为,都可以进行重写。可在子类中定义一个与要重写的父类方法同名的方法。这样,Python将不会考虑这个父类方法,而只关注你在子类中定义的相应方法。
- 导入类
我们可以像导入函数一样导入类,只需要把类放在模块里,导入的语法完全相同,也需要遵循同样的准则。通过导入类,可以使得我们的主模块代码更加简洁。 - Python标准库
Python标准库是一组模块,我们安装的Python都包含它。如random模块等,我们还可以从其他地方下载外部模块。