面向对象
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) # 不需要 newprint(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}"鸭子类型:替代 Java 接口
Section titled “鸭子类型:替代 Java 接口”「如果它走起来像鸭子、叫起来像鸭子,那它就是鸭子。」
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()) # 喵常用魔术方法(dunder methods)
Section titled “常用魔术方法(dunder methods)”双下划线包裹的特殊方法,让对象更好用:
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)| Java | Python |
|---|---|
new User() | User() |
this | self(要手写) |
toString() | __str__() |
equals() | __eq__() |
extends | class Child(Parent) |
@Override | 不需要 |
implements 接口 | 鸭子类型 / ABC 抽象基类 |
- [[03-函数与异常]] —— 方法本质是函数
- [[05-模块与虚拟环境]] —— 把类拆进不同文件
- [[02-数据结构]]