根据 Dog 类创建的每个实例都将存储名字和年龄,我们赋予了每条小狗蹲下(sit())和打 滚(roll_over())的能力:
class Dog:#定义类 def __init__(self, name, age): self.name = name self.age = age def sit(self): print(f"{self.name} is now sitting") def roll_over(self): print(f"{self.name} rolled over")
__init__()
类中的函数称为方法。每当根据类创建新实例时,Python 会自动调用这个 __init__()
方法,
在这个方法的定义中,形 参 self 必不可少,而且必须位于其他形参的前面。为何必须在方法定义中包含形参 self 呢?因 为 Python 调用这个方法来创建 Dog 实例时,将自动传入实参 self。每个与实例相关联的方法调 用都自动传递实参 self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。创 建 Dog 实例时,Python 将调用 Dog 类的方法__init__()
。我们将通过实参向 Dog()传递名字和年 龄,self 会自动传递,因此不需要传递它。每当根据 Dog 类创建实例时,都只需给最后两个形参 (name 和 age)提供值。
my_dog = Dog('willie', 8) print(f"my dog's name is {my_dog.name}") print(f"my dog is {my_dog.age} years old") #my dog's name is willie #my dog is 8 years old
my_dog.name my_dog.age
my_dog.sit() my_dog.roll_over()
my_dog = Dog('Willie', 6) your_dog = Dog('Lucy', 3) print(f"My dog's name is {my_dog.name}.") print(f"My dog is {my_dog.age} years old.") my_dog.sit() print(f"\nYour dog's name is {your_dog.name}.") print(f"Your dog is {your_dog.age} years old.") your_dog.sit()
编写类时,并非总是要从空白开始。如果要编写的类是另一个现成类的特殊版本,可使用继 承。一个类继承另一个类时,将自动获得另一个类的所有属性和方法。原有的类称为父类,而新 类称为子类。子类继承了父类的所有属性和方法,同时还可以定义自己的属性和方法。
__init__()
在已有的类基础上编写新类时,通常需要调用父类的方法__init__()
>。这将初始化在父类 __init__()
方法中定义的所有属性,从而让子类包含这些属性。
class Father: def __init__(self, sname, age): self.sname = sname self.age = age def info(self): print(f"{self.sname} is {self.age} years old ") class Son(Father): def __init__(self, sname, age): super().__init__(sname, age) student1 = Son('zhangsan', 18) student1.info() #zhangsan is 18 years old
定义子类时,必须在圆括号内指定父类的名称。
super()
是一个特殊的函数,它能够让子类调用父类的方法。父类也成为超类。
让一个类继承另一个类后,就可以添加区分子类和父类所需的新属性和新方法了。
子类独有的属性和方法写在继承父类之后。
class Father: def __init__(self, sname, age): self.sname = sname self.age = age def info(self): print(f"{self.sname} is {self.age} years old ") class Son(Father): def __init__(self, sname, age,sex): super().__init__(sname, age) self.sex = sex #新属性 def info_2(self): #新方法 if self.sex == '男': print(f"{self.sname} is a boy, he is {self.age} years old") else: print(f"{self.sname} is a girl, she is {self.age} years old") student1 = Son('zhangsan', 18, '男') student1.info_2() student1 = Son('xiaohong', 20, '女') student1.info_2() #zhangsan is a boy, he is 18 years old #xiaohong is a girl, she is 20 years old
对于父类的方法,只要它不符合子类模拟的实物的行为,都可以进行重写。为此,可在子类 中定义一个与要重写的父类方法同名的方法。这样,Python 将不会考虑这个父类方法,而只关注 你在子类中定义的相应方法。
class Math1: def __init__(self, a=3, b=4): self.a = a self.b = b def add(self): print(f"{self.a} + {self.b} = {self.a + self.b}") def mult(self): print(f"{self.a} * {self.b} = {self.a * self.b}") class Math2: def __init__(self, c, d): self.math1 = Math1() self.c = c self.d = d def cloth(self): print(f"{self.c} ** {self.d} = {self.c ** self.d}") number1 = Math2(4, 5) number1.math1.add() #3 + 4 = 7
可以将类存储在模块中,然后 在主程序中导入所需的模块。
from module_name import class_name
from module_name import class_1, class_2...
import module_name
from module_name import *
from module_name import class_name as other_