【新人系列】Python 入门(十七):类与对象

✍ 个人博客:https://blog.csdn.net/Newin2020?type=blog
专栏地址:https://blog.csdn.net/newin2020/category_12801353.html
专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们一起交流~
专栏简介:在这个专栏,我将带着大家从 0 开始入门 Python 的学习。在这个 Python 的新人系列专栏下,将会总结 Python 入门基础的一些知识点,方便大家快速入门学习~
❤️ 如果有收获的话,欢迎点赞 收藏 关注,您的支持就是我创作的最大动力

两类软件开发设计方法:

  • 面向过程编程: 根据业务逻辑从上往下,将需要用到的功能代码封装到函数中,着重关注开发的步骤和过程,典型代码为 C 语言。(关注过程)
  • 面向对象编程: 将函数或所需要的功能进行分类和封装,着重关注谁帮我做这件事,典型代码为 Java、C++ 等语言。(关注结果)

1. 理解类和对象

1.1 类和对象的定义

面向对象编程的 2 个非常重要的概念:类和对象。类也有属性和行为两个部分组成,而对象是类的具体实例。

  • “类”(Class)是一种用户自定义的数据类型,它定义了一组具有相同属性(数据成员)和行为(成员函数或方法)的对象的模板或蓝图。

可以将类想象成一个模具,它规定了用它制造出来的东西(对象)应该具有的特征和能执行的操作。

例如,定义一个 “学生” 类,可能包含学生的姓名、年龄、学号等属性,以及获取成绩、修改个人信息等方法。

  • “对象”(Object)则是类的具体实例。

也就是说,通过类这个模具创建出来的一个个具体的个体就是对象。

比如根据 “学生” 类创建出来的具体的某个学生小明,他有自己具体的姓名、年龄和学号等属性值,并且能执行类中定义的方法。

对象具有自己独立的状态(由其属性值决定),并且可以通过调用其方法来执行相关操作,与其他对象进行交互和协作,以完成程序的功能。

1.2 类的构成

类由 3 个部分构成:

  • 类的名称:类名
  • 类的属性:事物的特征描述信息,用于描述某个特征 “是什么”
  • 类的方法:允许对进行操作的方法(行为),用于说明事物 “能做什么”

抽象技巧: 拥有相同(或者类似)属性和行为的对象都可以抽象成一个类。

2. 创建类和对象

2.1 创建类

定义类有 2 种形式:新式类和经典类

使用 class 语句来创建一个新类,class 之后为类的名称并以冒号结尾。

  1. 定义经典类
class ClassName:
    '类的帮助信息'   # 类文档字符串
    class_suite    # 类体
  1. 定义新式类
class ClassName(object):
    '类的帮助信息'   # 类文档字符串
    class_suite    # 类体

Tips:经典类和新式类的区别

在 Python 2.x 中,经典类和新式类的区别:

  • 继承搜索顺序不同:
    • 经典类:深度优先搜索。
    • 新式类:广度优先搜索。
  • 基类不同:
    • 经典类:如果没有显式地继承自某个类,那么不会隐式地继承自 object 类。
    • 新式类:如果没有指定父类,则默认继承自 object 类。
      在 Python 3.x 中,只有新式类,所有的类都继承自 object 类,上述区别不再存在。
  1. 创建对象
对象名1 = 类名()
对象名2 = 类名()
对象名3 = 类名()

首字母大写的名称指的是类,并且建议使用驼峰式命名法。

类中的实例方法与普通的函数只有一个特别的区别 —— 它们必须有有一个额外的第一个参数名称,按照惯例它的名称是 self。self 代表类的实例,self 在定义类的实例方法时是必须有的,虽然在调用时不必传入相应的参数。

class Dog:
    def __init__(self, name, age):
        # 类内初始化方法中定义属性
        self.name = name
        self.age = age
        self.fur_colour = 'white'  # 默认值

    def sit(self):
        print(f"{self.name} is now sitting.")

    def roll_over(self):
        print(f"{self.name} rolled over!")

    def paw_colour(self, colour):
        self.paw_colour = colour    # 类内方法中定义属性

# 创建对象
my_dog = Dog('Willie', 6)

# 类外定义对象的属性
my_dog.eye_colour = 'blue'

Tips:
self 名称只是通用的名称,可以使用自定义的名称代替 self,但要保证类方法中的该名称都要保持一致。

2.2 实例变量和类变量

  • 实例变量,可以由类的对象来调用,这里可以看出成员变量一定是以 self. 的形式给出的,因为 self 的含义就是代表实例对象。
  • 类变量,可以由类名直接调用,也可以由对象来调用。
    上面例子涉及到的所有变量都属于实例变量,我们再通过例子进一步看看类变量如何调用。
  • 类变量类内调用:可以通过 self 进行调用(self.host),也可以通过类名称进行调用(Dog.host)。
  • 类变量类外调用:调用方式则和实例变量一样,可以通过实例名称进行调用(my_dog.host),但也可以通过类名进行调用(Dog.host)。

另外需要注意的是,不能通过类名称调用实例变量,例如 Dog.name 这样的调用是不被允许的。

class Dog:
    host = 'john'    # 定义类变量

    def __init__(self, name, age):
        # 类内初始化方法中定义属性
        self.name = name
        self.age = age
        self.fur_colour = 'white'  # 默认值

    def sit(self):
        print(f"{self.name} is now sitting.")

    def roll_over(self):
        print(f"{self.name} rolled over!")

    def paw_colour(self, colour):
        self.paw_colour = colour  # 类内方法中定义属性

    def find_host(self):
        print(f"{self.name}'s host is {self.host}.")  # 类变量使用方法一(Willie's host is john.)
        print(f"{Dog.host} is really nice!")  # 类变量使用方法二(john is really nice!)


# 创建对象
my_dog = Dog('Willie', 6)

# 类外定义对象的属性
my_dog.eye_colour = 'blue'

# 使用类变量
my_dog.find_host()
print(Dog.host)     # john

2.3 使用类

class Dog:
    --snip--
    
# 创建对象
my_dog = Dog('Willie', 6)

# 调用属性
print(f"My dog's name is {my_dog.name}.")       # My dog's name is Willie.
print(f"My dog is {my_dog.age} years old.")     # My dog is 6 years old.
my_dog.fur_colour = 'brown'  # 直接修改属性
print(my_dog.fur_colour)     # brown

# 调用方法
my_dog.sit()         # Willie is now sitting.
my_dog.roll_over()   # Willie rolled over!
my_dog.paw_colour('black')   # 通过方法修改属性的值
print(my_dog.paw_colour)     # black

3. 构造函数和析构函数

3.1 构造函数

init( ) 方法是 Python 中一种特殊的方法,被称为类的构造函数或初始化法,当创建了这个类的实例时就会调用该方法。

class Dog:
    def __init__(self, name, age):
        # 类内初始化方法中定义属性
        self.name = name
        self.age = age
        self.fur_colour = 'white'  # 默认值

3.2 析构函数

  • 创建对象后,python 解释器默认调用 init( ) 方法
  • 当删除对象时,python 解释器也会默认调用一个方法,这个方法为 del( ) 方法

删除触发时机:

  • 在 Python 中,当对象不再被使用并且没有任何引用指向它时,垃圾回收器会自动回收对象占用的内存,此时会触发对象的析构函数 del。
  • 需要注意的是,Python 的垃圾回收机制并不会立即回收不再使用的对象,而是在合适的时机进行清理。因此,无法确切地知道 del 方法何时会被调用。
  • 但不建议过度依赖 del 方法来进行关键的资源清理操作,对于一些需要明确释放的资源(如文件、网络连接等),建议在使用完毕后手动进行释放,以确保资源的及时释放和程序的稳定性。
class Dog:
    def __init__(self, name, age):
        # 类内初始化方法中定义属性
        self.name = name
        self.age = age
        self.fur_colour = 'white'  # 默认值

    # 当对象被删除时,会自动被调用
    def __del__(self):
        print("__del__方法被调用")
        print(f"{self.name} 去狗狗天堂了...")

4. 类的三种方法

在类的内部,使用 def 关键字来定义一个方法,而类中一共有三类方法:

4.1 实例方法

定义:第一个参数必须是实例对象,该参数名一般约定为 “self”,通过它来传递实例的属性和方法(也可以传类的属性和方法)。

调用方式:只能由实例对象调用。

应用场景:用于处理与特定实例相关的操作和逻辑,通常是对实例数据进行操作或执行依赖于实例状态的任务。

class Person:
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

    # 实例方法,必须要实例化才能使用
    def get_name(self):
        return self.name

    # 实例方法,必须要实例化才能使用
    def get_gender(self):
        return self.gender

    # 修改self名称
    def _get_name(test):
        return test.name

# 调用实例方法的第一种写法:直接用类名+实例化调用
print(Person("张三", "男").get_name())     # 但是这种方法实例没有存到变量里面,所以只能使用一次
print(Person("张三", "男").get_gender())

# 调用实例方法的第二种写法:1.先做实例化;2.用实例名+方法名
teacher = Person("张三", "男")  # 实例化
print(teacher.get_name())
print(teacher.get_gender())
print(teacher._get_name())

4.2 类方法

定义:使用装饰器 @classmethod。第一个参数必须是当前类对象,该参数名一般约定为 “cls”,通过它来传递类的属性和方法(不能传实例的属性和方法)。

调用方式:类和实例对象都可以调用。

应用场景:通常用于处理与类本身相关的操作,例如创建类的不同实例方式、修改类属性等,这些操作不依赖于特定的实例。

class Person:
    count = 0   # 类变量
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender
        Person.count += 1

    def get_name(self):
        return self.name

    # 加classmethod才能识别为类方法
    @classmethod
    def get_instance_count(cls):
        # return cls.count   # 和下行代码同等效果
        return Person.count

    @classmethod
    def create_a_instance(cls):
        print("create instance")
        return Person("张三", "男")    # 类方法里虽然不可以使用实例变量,但是可以创建实例

print(Person.count)  # 0
# 用类调用
print(Person.get_instance_count())   # 0
print(Person.create_a_instance().get_name())    # 张三
print(Person.get_instance_count())   # 1

teacher = Person("李四", "男")
print(Person.get_instance_count())   # 2
print(Person.create_a_instance().get_name())    # 张三

4.3 静态方法

定义:使用装饰器 @staticmethod。参数随意,没有 “self” 和 “cls” 参数,但是方法体中不能使用类或实例的任何属性和方法。

调用方式:类和实例对象都可以调用。

应用场景:用于与类相关但不依赖于类或实例状态的辅助功能,通常是一些通用的工具方法,与类的逻辑相关但不需要访问类或实例的数据。

class MyClass:
    @staticmethod
    def static_method():
        print("This is a static method")

# 类调用静态方法
MyClass.static_method()
# 实例对象调用静态方法
test = MyClass()
test.static_method()

你可能感兴趣的:(#,Python,新人系列,python,开发语言,后端,笔记,面试,面向对象,类)