Python类变量和实例变量(类属性和实例属性)

发布时间:2024年01月03日

【 一 】前言

????????类仅仅充当图纸的作用,本身并不能直接拿来用,而只有根据图纸造出的实际物品(对象)才能直接使用。因此,Python?程序中类的使用顺序是这样的:

  • 创建(定义)类,也就是制作图纸的过程;
  • 创建类的实例对象(根据图纸造出实际的物品),通过实例对象实现特定的功能。

【 二 】Python类的定义

在前面的文章有说过Python 中定义一个类使用class关键字实现,其就基本语法格式如下:

class 类名:
? ? 多个(≥0)类属性...
? ? 多个(≥0)类方法...

????????注意,无论是类属性还是类方法,对于类来说,它们都不是必需的,可以有也可以没有。另外,Python 类中属性和方法所在的位置是任意的,即它们之间并没有固定的前后次序。

写一个简单的实例:

import datetime

class Person:
    # 类属性
    x = 'human'

    # 构造函数
    def __init__(self, name, age):
        # 实例属性
        self.name = name
        self.age = age

    # 类方法
    @classmethod
    # 封装
    def from_year(cls, name, birth_year):
        age = datetime.date.today().year - birth_year
        return cls(name, age)

    # 实例方法
    def hex_hollow(self):
        print(f'hello, my name is {self.name}. I am {self.age} year old.')

# 创建一个Person对象
person = Person('maodada', 25)

# 调用实例方法
person.hex_hollow()

# 调用类方法
person2 = Person.from_year("BOB", 2002)

# hello, my name is maodada. I am 25 year old.

????????和变量名一样,类名本质上就是一个标识符,因此我们在给类起名字时,必须让其符合 Python 的语法。有读者可能会问,用 a、b、c 作为类的类名可以吗?从 Python 语法上讲,是完全没有问题的,但作为一名合格的程序员,我们必须还要考虑程序的可读性。

????????因此,在给类起名字时,最好使用能代表该类功能的单词,例如用“Student”作为学生类的类名;甚至如果必要,可以使用多个单词组合而成,例如初学者定义的第一个类的类名可以是“Thename”。????????

注意,如果由单词构成类名,建议每个单词的首字母大写,其它字母小写。

????????给类起好名字之后,其后要跟有冒号(:),表示告诉 Python 解释器,下面要开始设计类的内部功能了,也就是编写类属性和类方法。

????????其实,类属性指的就是包含在类中的变量;而类方法指的是包含类中的函数。换句话说,类属性和类方法其实分别是包含类中的变量和函数的别称。需要注意的一点是,同属一个类的所有类属性和类方法,要保持统一的缩进格式,通常统一缩进 4 个空格。

Python 变量和函数的使用,前面章节中已经做了详细的介绍,这里不再重复赘述。

????????通过上面的分析,可以得出这样一个结论,即 Python 类是由类头(class 类名)和类体(统一缩进的变量和函数)构成。例如,下面程序定义一个 Thename类:

class Thename:
    '''
    这是一个学习Python定义的第一个类
    '''
    # 下面定义了一个类属性
    add = 'https://www.cnblogs.com/'
    # 下面定义了一个ming方法
    def ming(self, content):
        print(content)

x = Thename.add

print(x)
# https://www.cnblogs.com/

当然我们也可以创建空类

class Empyth:
    pass

【 三 】静态方法

????????静态方法,其实就是我们学过的函数,和函数唯一的区别是,静态方法定义在类这个空间(类命名空间)中,而函数则定义在程序所在的空间(全局命名空间)中。

????????静态方法没有类似 self、cls 这样的特殊参数,因此 Python 解释器不会对它包含的参数做任何类或对象的绑定。也正因为如此,类的静态方法中无法调用任何类属性和类方法。

静态方法需要使用staticmethod修饰,例如:

class Chen:
    @staticmethod
    def info(name,add):
        print(name,add)

静态方法的调用,既可以使用类名,也可以使用类对象,例如:

class Chen:
    @staticmethod
    def info(name,add):
        print(name,add)
# 使用类名直接调用静态方法
Chen.info('博客园','https://www.cnblogs.com/')
# 博客园 https://www.cnblogs.com/

# 使用类对象调用静态方法
x = Chen()
x.info('CSDN','https://blog.csdn.net/m0_58310590?spm=1000.2115.3001.5343')
# CSDN https://blog.csdn.net/m0_58310590?spm=1000.2115.3001.5343

? ?静态方法是一种不依赖于实例的方法。它们通常与类相关,但与具体的实例对象无关。因此,我们可以通过类的名称来调用静态方法,而不需要创建实例对象。静态方法通常用于执行与类相关的操作,例如计算、转换等。在Python中,我们可以通过@staticmethod装饰器来定义一个静态方法。

【 四 】动态方法

当然有静态方法也有动态方法

????????静态方法是一种不依赖于实例的方法。它们通常与类相关,但与具体的实例对象无关。因此,我们可以通过类的名称来调用静态方法,而不需要创建实例对象。静态方法通常用于执行与类相关的操作,例如计算、转换等。在Python中,我们可以通过@staticmethod装饰器来定义一个静态方法。

实例:

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

    def say_hello(self):
        print(f'hello, my name is {self.name}.I {self.age}岁了')

# 创建一个Person对象
person = Person('maodada',25)

# 调用动态方法
person.say_hello()
# hello, my name is maodada.I 25岁了

????????需要注意的是,静态方法和动态方法都属于类的方法,但是它们之间有着不同的特点和用途。在实际编程中,我们需要根据具体的需求来选择使用哪种方法。

小总结:

????????静态方法不需要使用self关键字,而动态方法需要使用self来引用当前实例对象。

????????静态方法是与类相关但与具体实例对象无关的方法。因此,在静态方法中,我们不能直接访问实例对象的属性或方法,也不能使用self来引用实例对象。静态方法通常用于执行与类相关的操作,例如计算、转换等。

????????动态方法是与实例对象相关的方法。在动态方法中,我们可以通过self关键字来引用当前实例对象,并且可以访问实例对象的属性和其他方法。动态方法通常用于处理实例对象的状态、执行实例特定的操作等。

下面是一个示例,演示了静态方法和动态方法的不同之处下面是一个示例,演示了静态方法和动态方法的不同之处:

class MyClass:
    def __init__(self,value):
        self.value = value

    @staticmethod
    def stat():
        print("This is a stat")

    def instance(self):
        print(f'这个值为:{self.value}')
# 调用静态方法
MyClass.stat()
# This is a stat

# 创建实例对象
x = MyClass(10)
# 调用动他方法
x.instance()
# 这个值为:10

文章来源:https://blog.csdn.net/m0_58310590/article/details/135365257
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。