跳转到内容

面向对象

class User:
def __init__(self, name, age): # 构造方法,固定叫 __init__
self.name = name # self 相当于 this,但必须显式写
self.age = age
def greet(self): # 每个实例方法第一个参数都是 self
return f"I'm {self.name}"
u = User("Tom", 30) # 不需要 new
print(u.greet())

访问控制:靠「约定」不靠关键字

Section titled “访问控制:靠「约定」不靠关键字”

Python 没有 private/public,用下划线表达意图:

class Account:
def __init__(self):
self.balance = 0 # 公开
self._secret = 123 # 单下划线:约定「内部用」,但没人拦你
self.__pin = 9999 # 双下划线:名称改写,较难外部访问
class Admin(User): # 括号里写父类
def __init__(self, name, age, level):
super().__init__(name, age) # 调父类构造,和 Java 一样
self.level = level
def greet(self): # 重写,不用写 @Override
return f"Admin {self.name}, lv{self.level}"

「如果它走起来像鸭子、叫起来像鸭子,那它就是鸭子。」

Python 不靠 implements,只要对象有对应的方法就能用:

class Dog:
def speak(self): return "汪"
class Cat:
def speak(self): return "喵"
def make_speak(animal): # 不关心类型,有 speak() 就行
print(animal.speak())
make_speak(Dog()) # 汪
make_speak(Cat()) # 喵

双下划线包裹的特殊方法,让对象更好用:

class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def __str__(self): # 相当于 Java 的 toString()
return f"Point({self.x}, {self.y})"
def __eq__(self, other): # 相当于 equals()
return self.x == other.x and self.y == other.y
print(Point(1, 2)) # Point(1, 2)
JavaPython
new User()User()
thisself(要手写)
toString()__str__()
equals()__eq__()
extendsclass Child(Parent)
@Override不需要
implements 接口鸭子类型 / ABC 抽象基类
  • [[03-函数与异常]] —— 方法本质是函数
  • [[05-模块与虚拟环境]] —— 把类拆进不同文件
  • [[02-数据结构]]