Python编程中的类概念详解

Python–类

  • 一、类的定义方法
  • 二、创建类的实例
  • 三、创建类的成员
  • 1、创建属性
  • 创建类属性
  • 创建实例属性
  • 2、创建方法
  • 实例方法
  • 类方法
  • 四、类成员的访问权限
  • 1、保护属性成员
  • 2、私有属性成员
  • 五、装饰器
  • 一、类的定义方法

    在Python中,类可以通过关键字class来定义。类的定义包含在一个代码块中,并且通常以冒号:结尾。类的定义方法有以下几种:

    1. 空类定义:

    class MyClass:
        pass
    

    这是一个最简单的类定义,类体中没有任何内容。

    2. 带有属性和方法的类定义:

    class MyClass:
        def __init__(self, name):
            self.name = name  # 属性
            
        # 方法
        def say_hello(self):
            print(f"Hello, my name is {self.name}.")
    

    这个类定义了一个带有一个属性name和一个方法say_hello的类。__init__方法是一个特殊的方法,用于初始化对象的属性。

    3. 继承父类:

    class MyChildClass(MyParentClass):
        def __init__(self):
            super().__init__()
    

    二、创建类的实例

    所谓实例,是指类类型的变量。

    1. 如果类中定义了__init__方法,那么每当创建该类的实例时,__init__方法都会被自动调用。__init__方法通常用于初始化实例的属性。
    class MyClass:
        def __init__(self, arg1, arg2):
            self.arg1 = arg1
            self.arg2 = arg2
    
    instance = MyClass(1, 2)  # 创建类的实例,自动调用__init__方法
    print(instance.arg1)  # 输出: 1
    print(instance.arg2)  # 输出: 2
    
    1. 如果类中没有定义__init__方法,那么创建类时会自动创建__init__方法,并在创建实例时自动调用。
    class MyClass:
        pass
    
    instance = MyClass()  # 创建类的实例时自动创建并调用__init__方法
    

    上述两种方式都可以创建类的实例,但是通过__init__方法进行初始化更为常用和推荐,因为它能够自动在创建实例时完成初始化操作,避免了手动设置属性的繁琐和可能出现遗漏的情况。

    三、创建类的成员

    类的成员由实例方法和数据成员组成。
    实例方法通常称为方法,数据成员称为属性。

    所谓方法(或者实例方法)是指在类中定义的函数,数据成员(或者叫属性)是指在类中定义的变量。

    例如:

    class Student:
        def __init__(self, name, age, score):
        	# self.name,self.age,self.score是数据成员(或者叫属性)
            self.name = name
            self.age = age
            self.score = score
    
    	# introduce函数是Student的方法
        def introduce(self):
            print(f"姓名:{self.name}")
            print(f"年龄:{self.age}")
            print(f"成绩:{self.score}")
    
    # 创建一个学生实例
    student = Student("张三", 18, 90)
    
    # 调用实例方法,介绍学生信息
    student.introduce()
    

    1、创建属性

    属性分为类属性和实例属性。

    创建类属性

    类属性是同一个类的所有实例共享的属性。它们可以在类的定义中直接创建,并且对于同一个类的所有类的实例来说,它们的值是相同的。

    例如:

    class MyClass:
        class_attribute = 1
    
    instance1 = MyClass() # 创建实例1
    instance2 = MyClass() # 创建实例2
    
    print(instance1.class_attribute)  # 输出: 1
    print(instance2.class_attribute)  # 输出: 1
    

    通过上例可以看到,MyClass类的两个不同实例instance1instance2共同享有类属性class_attribute

    注意:类属性可以通过类名.属性名或者实例名.属性名的方法访问。

    例如:

    class MyClass:
        class_attribute = 1
    
    instance = MyClass() # 创建实例
    
    print(MyClass.class_attribute)    # 通过类名访问。输出: 1
    print(instance.class_attribute)  # 通过实例名访问。输出: 1
    

    创建实例属性

    实例属性是每个类实例特有的属性。它们可以在类的初始化方法(__init__)中使用 self 关键字创建,并且每个实例的实例属性的值可以是不同的。

    class MyClass:
        def __init__(self):
            self.instance_attribute = 2
    
    my_object = MyClass()
    print(my_object.instance_attribute)  # 输出: 2
    

    实例属性也可以在类的其他方法中创建和使用。

    class MyClass:
        def __init__(self):
            self.instance_attribute = 2
    
        def print_attribute(self):
            print(self.instance_attribute)
    
    my_object = MyClass()
    my_object.print_attribute()  # 输出: 2
    

    注意,实例属性对每个实例都是唯一的,每个实例都有自己的实例属性副本。而类属性是类的属性,所有的实例共享同一个类属性。实例属性只能通过实例.属性名访问。

    2、创建方法

    Python类的方法是在类内部定义的函数。它们用于定义类的行为和操作。类的方法可以访问和操作类的属性,也可以调用其他方法。

    实例方法

    实例方法是类中定义的普通方法。它们的第一个参数通常被命名为self,表示对当前实例对象的引用。通过这个参数,实例方法可以访问和操作当前对象的属性。

    class MyClass:
        def __init__(self, x):
            self.x = x
        
        def my_method(self):
            print(self.x)
    
    my_instance = MyClass(10)
    my_instance.my_method()  # 输出:10
    

    类方法

    类方法是在类级别定义的方法,使用@classmethod装饰器进行标识。类方法的第一个参数通常被命名为cls,表示对当前类的引用。类方法可以访问和修改类的属性,也可以调用其他类方法。

    class MyClass:
        x = 0
        
        @classmethod
        def my_class_method(cls):
            cls.x += 1
            print(cls.x)
    
    MyClass.my_class_method()  # 输出:1
    MyClass.my_class_method()  # 输出:2
    

    这是类方法的一个例子,其中类属性x被逐次递增。

    四、类成员的访问权限

    在Python中,可以使用下划线来表示成员的访问权限。有两种下划线的使用方式,分别是单下划线(保护权限:protected)和双下划线(私有权限:private)。

    1、保护属性成员

    1. 单下划线(_):表示成员是受保护的,约定成员应该被视为非公开的,不应该直接访问。但实际上,Python并不会强制限制对受保护成员的访问,只是通过命名约定来提醒开发者不要直接访问这些成员。

    例如:

    class MyClass:
        _protected_member = 10 # 保护属性成员
            
        def print_protected_member(self):
            print(self._protected_member)
    
    my_object = MyClass()
    my_object.print_protected_member()  # 通过实例方法访问保护类型成员。输出:10
    print(my_object._protected_member)  # 通过实例访问保护类型成员。输出:10(不推荐直接访问)
    print(MyClass._protected_member)    # 通过类名访问保护类型成员。输出:10
    
    # 输出:
    10
    10
    10
    

    保护类型的成员,允许类本身子类实例直接访问,但不能使用from module import *导入。

    2、私有属性成员

    双下划线(__):表示成员是私有的,只能在类的内部访问,无法从外部直接访问。这样的成员可以防止子类中的命名冲突。

    例如:

    class MyClass:
        __protected_member = 10 # 私有属性成员
            
        def __init__(self):
            print(MyClass.__protected_member) # 实例方法中访问私有属性成员
    
    my_object = MyClass()
    print(my_object._MyClass__protected_member)  # 通过“实例名._类名__成员名”访问私有属性。
    
    # 输出:
    10
    10
    

    需要注意的是,Python中的私有成员实际上是经过了名称重整(name mangling)的,在名称前会加上一个下划线和类名,所以无法直接访问。如果想在外部访问私有成员,可以通过实例名._类名__成员名的方式访问,但这种方式不推荐使用。

    五、装饰器

    用法1:

    在Python中,可以通过@property(装饰器)将一个方法转为属性,从而可以实现直接使用方法名来访问方法,而不需要再添加一对小括号,这样可以使得代码更加简洁。

    例如:

    class Rect():
        def __init__(self, width, height):
            self.width = width
            self.height = height
    
        @property
        def area(self):
            return self.width * self.height
    
    rect = Rect(800, 600)
    print("面积为:", rect.area)
    
    # 输出
    面积为: 480000
    

    用法2:

    在Python中,默认情况下,创建的类属性或者实例是可以在类体外修改的,如果要想限制其不能在类体外修改,可以将其设置为私有的,但设置为私有的之后又不能在类体外访问。如果要创建一个可以读取,但不能修改的属性,可以使用@property实现只读属性。

    例如:

    class MyClass():
        def __init__(self):
            self.__private_attribute = 10 		# 私有属性
            
        @property                         		# 将方法转为属性
        def print_attribute(self):        		# 定义方法
            return self.__private_attribute  	# 返回私有属性的值
    
    instance = MyClass()  						# 创建实例
    print(instance.print_attribute)  			# 获取私有属性的值
    

    作者:墨上烟雨

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python编程中的类概念详解

    发表回复