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关键字定义类。

示例代码:

python 复制代码
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、对象

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

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

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

示例代码:

python 复制代码
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关键字,但是约定俗成的命名,可以使用其他名称代替,但通常不建议。

示例代码:

python 复制代码
def __init__(self, name, age):
    self.name = name
    self.age = age

3、属性和方法

3.1、属性

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

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

示例代码:

python 复制代码
print(person1.name)  # 输出:"Alice"
print(person2.age)    # 输出:30

3.2、方法

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

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

示例代码:

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

3.3、类方法

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

python 复制代码
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__命名,用于在创建对象时初始化对象的属性。

python 复制代码
def __init__(self, name, age):
    self.name = name
    self.age = age

3.5、静态方法

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

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

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

python 复制代码
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()
相关推荐
一雨方知深秋几秒前
智慧商城:封装getters实现动态统计 + 全选反选功能
开发语言·javascript·vue2·foreach·find·every
海威的技术博客2 分钟前
关于JS中的this指向问题
开发语言·javascript·ecmascript
觅远4 分钟前
python实现word转html
python·html·word
Yhame.25 分钟前
Java 集合框架中的 List、ArrayList 和 泛型 实例
java
coding侠客26 分钟前
Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘
java·spring boot·后端
froginwe1129 分钟前
PostgreSQL表达式的类型
开发语言
悠然的笔记本30 分钟前
python2和python3的区别
python
委婉待续31 分钟前
java抽奖系统(八)
java·开发语言·状态模式
deja vu水中芭蕾33 分钟前
嵌入式C面试
c语言·开发语言
爱码小白34 分钟前
PyQt5 学习方法之悟道
开发语言·qt·学习方法