Python类与对象简介

目录

一、类和对象基本概念

二、类和对象的使用

使用class关键字定义类:

通过调用类名来创建对象:

访问对象的属性

调用对象的方法

三、封装(Encapsulation)

四、继承(Inheritance)

1、单继承

2、多继承

五、多态(Polymorphism)

六、魔法方法、类方法和静态方法

1、魔法方法(Magic Methods)

2、类方法(Class Methods)

3、静态方法(Static Methods)


一、类和对象基本概念

Python中的类和对象是面向对象编程(OOP)的核心概念。面向对象编程是一种编程范式,它通过使用类和对象来组织代码,从而提高代码的可重用性、灵活性和可维护性。

  1. 类(Class)是创建对象的蓝图或模板。它定义了一组属性(变量)和方法(函数),这些属性和方法用于描述对象的状态和行为。

  2. 对象(Object)是类的实例。通过创建类的实例,可以访问类的属性和方法。

  3. 属性(Attribute)类的属性是属于类本身的变量,它们被该类的所有对象所共享;实例属性是定义在初始化方法__init__中的变量,每个对象都有自己独立的实例属性。

  4. 方法(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())  # 输出:吃饭
 ​

静态方法通常用于实现那些与类相关但不依赖于类或实例的逻辑。由于静态方法与类和实例都无关,因此它们不能访问类属性或实例属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值