目录
一、类和对象基本概念
Python中的类和对象是面向对象编程(OOP)的核心概念。面向对象编程是一种编程范式,它通过使用类和对象来组织代码,从而提高代码的可重用性、灵活性和可维护性。
-
类(Class)是创建对象的蓝图或模板。它定义了一组属性(变量)和方法(函数),这些属性和方法用于描述对象的状态和行为。
-
对象(Object)是类的实例。通过创建类的实例,可以访问类的属性和方法。
-
属性(Attribute)类的属性是属于类本身的变量,它们被该类的所有对象所共享;实例属性是定义在初始化方法__init__中的变量,每个对象都有自己独立的实例属性。
-
方法(Method)类的方法是定义在类内部的函数,它们可以操作对象的属性或者执行与类相关的操作。
二、类和对象的使用
-
使用class关键字定义类:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self):
print(f"你好,我是{self.name},我今年{self.age}岁。")
Person类有一个特殊的方法__init__,它是类的构造方法,用于初始化对象的属性。self参数代表类的实例本身,在类的方法中,通过self来访问对象的属性和其他方法。
-
通过调用类名来创建对象:
p1 = Person("张三", 30)
p2 = Person("李四", 25)
每个对象都有自己独立的实例属性,在本例中,p1和p2都有name和age属性。
-
访问对象的属性
print(p1.name, p1.age) # 输出:张三 30
print(p2.name, p2.age) # 输出:李四 25
使用点运算符(.)来访问对象的属性。
-
调用对象的方法
p1.say_hello() # 输出:你好,我是张三,我今年30岁。
p2.say_hello() # 输出:你好,我是李四,我今年25岁。
对象的方法可以访问和修改对象的属性。本例在say_hello方法中,通过self.name和self.age来访问对象的name和age属性,并将它们打印出来。
三、封装(Encapsulation)
封装是将数据(属性)和行为(方法)打包到一个类中,并隐藏其内部实现细节的过程。在Python 中,虽然没有像其他语言(如 Java)那样严格的访问控制修饰符,但是可以通过私有属性和方法来实现类似的数据隐藏。通常,使用双下划线前缀(__)来定义私有属性和方法,使其只能在类内部直接访问。在类外部很难直接访问这些属性和方法,但是可以通过暴露出来的接口(如本例中的get_age()和set_age()方法)访问属性、使用方法。
class Person:
def __init__(self, name):
self.name = name
self.__age = 18
def say_hello(self):
print(f"你好,我是{self.name},我今年{self.__age}岁。") # 在类内部可以直接访问__age属性
def get_age(self):
return self.__age
def set_age(self, age):
self.__age = age
person = Person("张三")
# 在类的外部可以通过get_age()和set_age()方法来访问和修改__age属性
print(person.get_age()) # 输出: 18
person.set_age(20)
print(person.get_age()) # 输出: 20
四、继承(Inheritance)
继承是面向对象编程的重要概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。这样可以实现代码的复用,并且可以在子类中扩展或修改父类的功能。
1、单继承
一个子类只能继承一个父类。
class Person:
def __init__(self):
self.name = "人"
self.age = 25
self.height = 170
def say(self):
print("我是{},今年{}岁".format(self.name, self.age))
def sing(self):
print("人会唱歌")
class Teacher(Person): # 定义了一个Teacher类,它继承了Person类的属性和方法
def __init__(self):
super().__init__()
self.name = "老师"
def sing(self):
print("老师会唱歌")
teacher = Teacher()
teacher.say() # 输出:我是老师,今年25岁
teacher.sing() # 输出:老师会唱歌
在Teacher类的构造函数中,使用 super().__init__() 来调用父类Person的构造函数,初始化继承自父类的属性。sing方法在Person类的基础上进行了重写,以适应Teacher类的需求。
2、多继承
Python支持多继承,即一个子类可以继承多个父类。
class Person:
def __init__(self):
self.name = "人"
self.age = 25
self.height = 170
def say(self):
print("我是{},今年{}岁".format(self.name, self.age))
def sing(self):
print("人会唱歌")
class Programmer(Person): # 定义了一个Programmer类,它继承了Person类的属性和方法
def __init__(self):
super().__init__()
self.name = "程序员"
def coding(self):
print("程序员会编程")
class Teacher(Person): # 定义了一个Teacher类,它继承了Person类的属性和方法
def __init__(self):
super().__init__()
self.name = "老师"
def sing(self):
print("老师会唱歌")
class Student(Programmer, Teacher): # 定义了一个Student类,它继承Programmer类和Teacher类的属性和方法
def __init__(self):
super().__init__()
self.name = "学生"
def sing(self):
print("学生会唱歌")
student = Student()
student.say() # 输出:我是学生,今年25岁
student.sing() # 输出:学生会唱歌
student.coding() # 输出:程序员会编程
在本例中,我们定义了一个Student类,它既继承自Teacher类,又继承自另一个Programmer类。在多继承的情况下,先在当前类中查找方法,然后按照继承顺序在父类中查找,直到找到方法或者引发AttributeError。
五、多态(Polymorphism)
多态是指同一个方法调用由于对象不同可能会产生不同的行为。具体来说,多态允许将子类的对象视为父类类型的对象使用,并且可以调用父类中定义的方法,而实际执行的是子类覆盖后的方法。这种机制使得程序可以在运行时动态地改变对象的行为,增加了代码的灵活性和可扩展性。
class Person:
def __init__(self):
self.name = "人"
def sing(self):
print("人会唱歌")
class Teacher(Person): # 定义了一个Teacher类,它继承了Person类的属性和方法
def __init__(self):
super().__init__()
self.name = "老师"
def sing(self):
print("老师会唱歌")
class Student(Person): # 定义了一个Student类,它继承Person类的属性和方法
def __init__(self):
super().__init__()
self.name = "学生"
def singing(a):
a.sing()
singing(Person()) # 输出:人会唱歌
singing(Teacher()) # 输出:老师会唱歌
singing(Student()) # 输出:人会唱歌
在本例中,Teacher和Student类都继承自Person类,并重写了sing方法。通过singing函数,我们传入不同的对象(Person、Teacher和Student),并调用相同的sing方法,但实际执行的是子类中重写的方法。
六、魔法方法、类方法和静态方法
1、魔法方法(Magic Methods)
魔法方法(也称为特殊方法或双下划线方法)是Python中一系列以双下划线(__)开头和结尾的方法。这些方法具有特殊的意义,用于实现Python中的某些内置操作。例如:
-
__new__:用于创建类的实例。
-
__init__:构造函数,用于初始化对象。
-
__del__ :它在对象被垃圾回收之前调用,主要用途是进行清理工作,比如关闭文件、释放资源等。
魔法方法的主要作用是为类提供定制的行为,使类的行为更加符合预期,同时增强了代码的可读性和灵活性。
2、类方法(Class Methods)
类方法是使用@classmethod装饰器定义的方法,它的第一个参数是类本身(通常命名为cls),而不是实例对象(self)。
class Person:
count = 0
def __init__(self, name, age):
self.name = name
self.age = age
Person.count += 1
@classmethod # 使用装饰器变成一个类方法
def get_count(cls): # 第一个参数命名为cls
return cls.count
p1 = Person("张三", 30)
p2 = Person("李四", 24)
print(Person.get_count()) # 输出:2
类方法通常用于执行与类相关的操作,如访问类属性、创建类实例等,不能直接访问实例属性。由于类方法不依赖于实例对象,因此可以在不创建实例的情况下调用它们。
3、静态方法(Static Methods)
静态方法是通过@staticmethod装饰器定义的方法,它既不接收类本身(cls)也不接收实例(self)作为参数。静态方法通常用于定义与类或实例无关的辅助函数。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@staticmethod
def eat():
print("吃饭")
print(Person.eat()) # 输出:吃饭
静态方法通常用于实现那些与类相关但不依赖于类或实例的逻辑。由于静态方法与类和实例都无关,因此它们不能访问类属性或实例属性。