面向对象(Object-Oriented Programming,OOP)是Python中重要的编程范式.面向对象三大特性封装,继承,多态class Person: def __init__(self, name, age): self.name = name # 实例属性 self.age = age # 实例属性p = Person("Alice", 25) # 自动调用 __init__print(p.name, p.age) # 输出: Alice 25
from datetime import datetimeclass Employee: company="GOOGLE" salary_rate=1.05 def __init__(self,name,salary): self.name=name self.salary=salary #实例方法 def raise_salary(self): self.salary*=self.salary_rate print(f"{self.name}加薪之后的工资是:{self.salary}") #类方法(操作属性或作为工厂方法) @classmethod def set_raise_rate(cls,new_rate): cls.salary_rate=new_rate print(f"新的加薪比例是:{cls.salary_rate}") #静态方法(与类和示例无关的工具函数) @staticmethod def is_workday(day): if day.weekday() == 5 or day.weekday() == 6: return False return Trueif __name__ == "__main__": #创建员工实例 e1=Employee("Tom",5000) e2=Employee("Jerry",6000) #调用实例方法 e1.raise_salary() e2.raise_salary() #调用类方法操作类属性 Employee.set_raise_rate(1.08) e1.raise_salary() #调用静态方法 current_time=datetime.now() print(current_time) print(f"{current_time}是工作日吗?{Employee.is_workday(current_time)}")
方法类型 | 装饰器 | 第一个参数 | 可访问内容 | 典型用途 | 调用方式 |
实例方法 | 无 | self | 实例属性、类属性 | 操作或查询实例状态 | obj.method() |
类方法 | @classmethod | cls | 类属性(不能访问实例属性) | 修改类状态、创建工厂方法 | Class.method() 或 obj.method() |
静态方法 | @staticmethod | 无 | 无(与类和实例无关) | 工具函数,逻辑上属于类的命名空间 | |
类继承属于面向对象编程的核心之一,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的重用class Animals: def __init__(self,name): self.name=name def speak(self): raise NotImplementedError("子类必须实现此方法")class Dog(Animals): def __init__(self,name): super().__init__(name) def speak(self): return self.name+' 汪汪汪'class Cat(Animals): def __init__(self,name): super().__init__(name) def speak(self): return self.name+' 喵喵喵'if __name__ == '__main__': animals=[Dog("BINGO"),Cat("kitty")] for a in animals: print(a.speak())
class Flyable: def fly(self): print("能飞")class Swimmable: def swim(self): print("能游泳")class Duck(Flyable, Swimmable): pass# 使用duck = Duck()duck.fly()duck.swim()
抽象类(Abstract Class)它用于定义一组方法的规范,但不提供这些方法的具体实现.抽象类不能被实例化,主要是作为其他类的积累,子类实现特定的方法.from abc import ABC,abstractmethodclass Shape(ABC): @abstractmethod def area(self): pass @abstractmethod def perimeter(self): passclass Rectangle(Shape): def __init__(self,width,height): self.width=width self.height=height def area(self): return self.width*self.height def perimeter(self): return 2*(self.width+self.height)if __name__ == '__main__': r = Rectangle(10,20) print(f"area:{r.area()},perimeter:{r.perimeter()}")
多态(Polymorphism)它允许不同类的对象对同一方法调用做出不同的响应.class Animal: def speak(self): passclass dog(Animal): def speak(self): print("汪汪汪")class Cat(Animal): def speak(self): print("喵喵喵")class Duck(Animal): def speak(self): print("嘎嘎嘎")def animal_speak(animal:Animal): animal.speak()if __name__ == "__main__": dog=dog() cat=Cat() duck=Duck() animal_speak(dog) animal_speak(cat) animal_speak(duck)