Appearance
Python 类
面向对象编程(OOP)把数据和操作数据的方法打包在一起,形成"类(Class)"。类是模板,根据类创建出来的具体个体叫做对象(Object)。
定义类
用 class 关键字定义类。方法(类里的函数)第一个参数必须是 self,代表"当前这个对象":
python
class Mammal:
def __init__(self, name, sex):
self.name = name
self.sex = sex
def breathe(self):
print(self.name + " Breathing")
def poop(self):
print(self.name + " Pooping")__init__是构造方法,在创建对象时自动调用,用来初始化属性。self.name = name把传入的name绑定到当前对象上,成为它的属性。- 调用方法时,
self由 Python 自动传入,你只需要写对象.breathe()。
创建对象
python
cat = Mammal("咪咪", "母")
cat.breathe() # 咪咪 Breathing
cat.poop() # 咪咪 Pooping继承
一个类可以继承另一个类,从而拥有父类的属性和方法,还能扩展自己的功能:
python
class Human(Mammal):
def read(self):
print(self.name + " Reading")
class Cat(Mammal):
def scratch(self):
print(self.name + " Scratching")Human 和 Cat 都继承自 Mammal,所以它们自动拥有 name、sex、breathe()、poop(),又各自新增了 read()、scratch():
python
alice = Human("Alice", "女")
alice.breathe() # Alice Breathing
alice.read() # Alice Reading
kitty = Cat("咪咪", "母")
kitty.scratch() # 咪咪 Scratchingsuper() 调用父类
在子类中,可以用 super() 调用父类的方法,最常见的是调用父类的构造方法,避免重复写初始化代码:
python
class Father:
def __init__(self, name):
self.name = name
class Son(Father):
def __init__(self, name):
super().__init__(name) # 调用父类 Father 的 __init__
self.age = 0 # 子类自己新增的属性注意
子类定义时必须写成 class Son(Father): 表明继承关系;而 super().__init__(name) 里是两个下划线的 __init__。原笔记中这两处都写成了不带括号的 class Son: 和 super().__init__(),这里已修正。
使用:
python
son = Son("小明")
print(son.name) # 小明方法重写
子类可以重新定义父类已有的方法,覆盖它的行为:
python
class Cat(Mammal):
def breathe(self):
print(self.name + " 正在用猫的方式呼吸")
kitty = Cat("咪咪", "母")
kitty.breathe() # 咪咪 正在用猫的方式呼吸类方法与静态方法
除了普通方法(第一个参数是 self),还有两种特殊方法:
- 类方法
@classmethod:第一个参数是cls(代表类本身),可以访问类属性。 - 静态方法
@staticmethod:不需要self或cls,相当于放在类里的普通函数。
python
class Math:
pi = 3.14159
@classmethod
def circle_area(cls, radius):
return cls.pi * radius * radius
@staticmethod
def add(a, b):
return a + b
print(Math.circle_area(5)) # 78.53975
print(Math.add(3, 4)) # 7提示
初学者最常见的场景是普通方法(带 self)。类方法和静态方法在编写工具类或工厂方法时会用到,了解即可。
完整示例
python
class Mammal:
def __init__(self, name, sex):
self.name = name
self.sex = sex
def breathe(self):
print(self.name + " Breathing")
class Human(Mammal):
def read(self):
print(self.name + " Reading")
class Cat(Mammal):
def scratch(self):
print(self.name + " Scratching")
alice = Human("Alice", "女")
kitty = Cat("咪咪", "母")
alice.breathe()
alice.read()
kitty.breathe()
kitty.scratch()运行结果:
text
Alice Breathing
Alice Reading
咪咪 Breathing
咪咪 Scratching