Python类变量和实例变量(类属性和实例属性)
【 一 】前言
????????类仅仅充当图纸的作用,本身并不能直接拿来用,而只有根据图纸造出的实际物品(对象)才能直接使用。因此,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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!