当前位置: 首页 > article >正文

Python进阶知识

Python类和对象

         Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程。接下来我们先来简单的了解下面向对象的一些基本特征。


1、面向对象技术简介

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

  • 方法:类中定义的函数。

  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。

  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。

  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

  • 局部变量:定义在方法中的变量,只作用于当前实例的类。

  • 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。

  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。

  • 实例化:创建一个类的实例,类的具体对象。

  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。对象可以包含任意数量和类型的数据。

2、类和对象的基础语法

2.1、类的定义

  • 类是一种自定义数据类型,用于创建对象。

  • 类定义了对象的属性(数据成员)和方法(函数成员)。

  • 通过class关键字定义类。

示例代码:

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

    def introduce(self):
        print(f"My name is {self.name} and I am {self.age} years old.")

2.2、对象

  • 对象是类的实例,具有类定义的属性和方法。

  • 通过调用类的构造函数来创建对象。

  • 每个对象都有自己的状态,但共享相同的方法定义。

示例代码:

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

    def introduce(self):
        print(f"My name is {self.name} and I am {self.age} years old.")
person1 = Person("Alice", 25)
person2 = Person("Bob", 30)

2.3、self

  • self是类方法的第一个参数,用于引用对象本身。

  • self不是Python关键字,但是约定俗成的命名,可以使用其他名称代替,但通常不建议。

示例代码:

def __init__(self, name, age):
    self.name = name
    self.age = age

3、属性和方法

3.1、属性

  • 属性是对象的特征或数据成员,用于存储对象的状态信息。

  • 可以通过点运算符访问或修改属性。

示例代码:

print(person1.name)  # 输出:"Alice"
print(person2.age)    # 输出:30

3.2、方法

  • 方法是类中定义的函数成员,用于执行特定操作。

  • 方法通常与对象相关联,并可以访问对象的属性。

示例代码:

def introduce(self):
    print(f"My name is {self.name} and I am {self.age} years old.")

3.3、类方法

        类方法, 使用@classmethod装饰器来定义类方法。类方法是与类关联的方法,而不是与实例关联的方法。这意味着类方法可以在不创建类的实例的情况下调用,并且通常用于执行与类本身相关的操作。类方法的第一个参数通常被命名为cls,表示类本身。

class MyClass:
    class_variable = 0  # 类变量
​
    def __init__(self, instance_variable):
        self.instance_variable = instance_variable
​
    @classmethod
    def class_method(cls, x):
        cls.class_variable += x
        print(f"This is a class method. class_variable: {cls.class_variable}")
​
    def instance_method(self):
        print(f"This is an instance method. instance_variable: {self.instance_variable}")
​
# 创建类的实例
obj1 = MyClass(10)
obj2 = MyClass(20)
​
# 调用类方法,不需要创建实例
MyClass.class_method(5)#This is a class method. class_variable: 5
​
# 访问类变量
print(MyClass.class_variable)  # 输出:5
​
# 调用实例方法
obj1.instance_method()# This is an instance method. instance_variable: 10

        在上面的示例中,class_method是一个类方法,它可以在不创建MyClass的实例的情况下被调用。类方法通过cls参数访问类级别的属性(如class_variable),而实例方法通过self参数访问实例级别的属性(如instance_variable)。

3.4、构造方法

构造方法是类中的特殊方法,__init__命名,用于在创建对象时初始化对象的属性。

def __init__(self, name, age):
    self.name = name
    self.age = age

3.5、静态方法

        在Python中,静态方法(Static Method)是类中的一个函数,它既不接收类对象(cls)作为第一个参数,也不接收实例对象(self)作为第一个参数。这意味着静态方法无法直接访问类属性或实例属性。静态方法使用@staticmethod装饰器来定义。它们主要用于那些逻辑上与类相关,但实际上并不需要访问类属性或实例属性的场景。静态方法可以被视为类命名空间中的普通函数,只是它们通过类来组织,并且可以通过类名或实例名来调用。下面是一个包含静态方法的Python类的示例:

class A:
    class_attr = 42  # 类属性

    def __init__(self, value):
        self.instance_attr = value  # 实例属性

    @staticmethod
    def myadd(a, b):
        # 只能访问传递的参数,不能访问类属性和实例属性
        return a + b

# 创建类实例
a = A(10)

# 调用静态方法
print(A.myadd(100, 200))  # 输出: 300
print(a.myadd(300, 400))  # 输出: 700

下面实例一个所有方法都用到的类

class MyClass:  
    # 类属性  
    class_attribute = "I am a class attribute"  
  
    def __init__(self, instance_value):  
        """构造方法,用于初始化实例属性"""  
        self.instance_attribute = instance_value  # 实例属性  
  
    def instance_method(self):  
        """实例方法,可以访问实例属性和类属性"""  
        print(f"Instance attribute: {self.instance_attribute}")  
        print(f"Class attribute: {MyClass.class_attribute}")  
  
    @classmethod  
    def class_method(cls):  
        """类方法,只能访问类属性,不能访问实例属性"""  
        print(f"Class method called. Class attribute: {cls.class_attribute}")  
  
    @staticmethod  
    def static_method():  
        """静态方法,不能访问实例属性和类属性(但可以通过类名或实例名间接访问,不推荐)"""  
        print("Static method called. It cannot directly access instance or class attributes.")  
        # 下面的行展示了如何通过类名间接访问类属性(不推荐)  
        # print(MyClass.class_attribute)  
  
# 示例使用  
if __name__ == "__main__":  
    # 创建MyClass的实例  
    my_instance = MyClass("This is an instance value")  
      
    # 调用实例方法  
    my_instance.instance_method()  
      
    # 调用类方法  
    MyClass.class_method()  
    # 也可以通过实例调用类方法(但不推荐)  
    # my_instance.class_method()  
  
    # 调用静态方法  
    MyClass.static_method()  
    # 也可以通过实例调用静态方法(但不推荐)  
    # my_instance.static_method()


http://www.kler.cn/news/354679.html

相关文章:

  • 智能平台或系统中的归因、根因分析案例集锦
  • 使用python实现图书管理系统
  • Unity动画系统
  • 外包干了3周,技术退步太明显了。。。。。
  • 使用React Router实现前端的权限访问控制
  • 【Flutter】Dart:异步
  • docker容器里的时间不对,linux解决方案
  • 机器学习——向量化
  • 学习第三十六行
  • 【实战案例】树形字典结构数据的后端解决方案
  • 雷达数据与影像数据直观对比
  • YOLO的更新迭代
  • 基于SpringBoot的企业客户管理系统的设计与实现(论文+源码)_kaic
  • 软件测试CNAS实验室软件维护性测试作业指导书怎么写
  • AI大模型与相对论的结合点的思考、应用及相对论原理与公式表达
  • C++之《剑指offer》学习记录(9):字符串替换空格
  • 3D Slicer 教程五 ---- 基本功能介绍(二)
  • 五款软件神器
  • 萱仔求职复习系列——力扣
  • KafKa 集群【docker compose】