Python关于类内存分析

这是我参与更文挑战的第 20 天,活动详情查看: 更文挑战

概述

Python一切都是对象,面向对象编程最重要的就是类。类也是对象

我们都知道类是创建对象的模组,对象是类的实例化。

类包含对象的属性和方法,上期我们学习相关的实例相关的内存分析的知识,本期将学习类相关的知识以及其底层原理

1. 类对象

我们在前面已经学习了类的定义,class 类名: 的形式。

实际上,当解释器执行class语句时,就会创建一个类对象,类的数据类型是type类型。

类对象定义

class Animal:
    pass  # 占位,空语句

print(type(Animal))
print("Animal的地址:",id(Animal)) #2058217676696

dog = Animal #创建类对象
dog2 = dog() 
print("dog的地址:",id(dog)) #2058217676696
print(dog2) # <__main__.Animal object at 0x000001DF37D5B848>

复制代码

类对象运用

类对象运行结果

2. 类属性

2.1 类属性概念

类属性是从属于类对象的属性,也称为类变量。

类属性从属于类对象,可以被所有实例对象共享。

类属性定义方式为:

class 类名:
    
    类属性名 = 初始值
复制代码

在类中或者类外围,可以通过类名.类变量名类读写

类属性定义

2.2 类属性内存分析
class Student:
    classname = "Twenty"    # 类属性
    teachername = "JueJing"  # 类属性
    count = 0  # 类属性

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

    def information(self):
        print("{0} ".format(Student.classname))  # 调用类属性
        print("{0} age is {1}".format(self.name,self.age)) #调用实例属性

s1 = Student("Tome",19)
s1.information()
复制代码
  1. 首先Python会在堆内存中创建数据类型为type的student类
  2. student类里面有包含类属性classname和teachername两个属性

类属性创建

  1. 实例属性不在类里,而是通过Student(“Tome”,19)创建的对象里

实例属性

  1. 实例对象s1.information调用,可以调用类属性

对象调用

代码运行结果为:

实例属性运行结果

3. 类方法

3.1 类方法概念

类方法是从属于类对象的方法。类方法通过装饰器@classmethod来定义。

@classmethod
def 类方法名(cls,[形参列表]):
    函数体
    
复制代码
  1. @classmethod必须位于方法上面一行

  2. 第一个cls必须有,cls指的就是类对象本身

  3. 调用类方法格式:

       类名.类方法名(参数列表)
       #参数列表中,不需要也不能给cls传值
    复制代码
  4. 类方法中访问实例属性和实例方法会导致错误

  5. 子类继承父类方法时,传入cls是子类对象,而非父类对象

  6. 实例对象也能对类方法进行访问

类方法

3.2 类方法内存分析
class Student:
    classname = "Twenty"    #类属性
    teachername = "JueJing" #类属性
    count = 0

    def __init__(self,name,age):
        self.name = name
        self.age = age
        Student.count = Student.count + 1
 
    @classmethod
    def teacher(cls):     # 类方法
        print("{0} teacher name is {1}".format(cls.classname,cls.teachername))


#类调用
Student.tearcher()

#实例对象调用类方法
s1 = Student("Tome",19) 
s1.tearcher()
复制代码
  1. python解释器会在堆内存中创建Student类
  2. Student类里包含有类方法tearcher()
  3. 通过Student.tearcher()调用类方法
  4. 也可以通过s1.tearcher()对象来调用类方法

类方法实践

代码运行结果为:

类方法运行结果

4. 静态方法

Python 中允许定义与类对象无关的方法,称为静态方法。

静态方法和在模块中定义普通函数没有区别,只不过静态方法放到类的名字空间里面,需要通过“类调用”。

静态方法通过装饰器@staticmethod来定义,格式如下:

@staticmethod
def 静态方法名([形参列表]):
    函数体
复制代码
  1. @staticmethod 必须位于方法上面一行
  2. 调用静态方法格式:类名.静态方法名(参数列表)
  3. 静态方法中访问实例属性和实例方法会导致错误
  4. 实例对象也能对静态方法进行调用

静态方法定义

我们继续哪Student类来举个?,继续添加一个静态方法

class Student:
    classname = "Twenty"    # 类属性
    teachername = "JueJing"  # 类属性

    def __init__(self,name,age): #实例属性
        self.name = name
        self.age = age
    
    
    @classmethod
    def tearcher(cls):     # 类方法
        print("{0} tearcher name is {1}".format(Student.classname,Student.tearchername))
    
    
    @staticmethod
    def add(a,b):  # 静态方法
        print("{0}+{1}={2}".format(a,b,(a+b)))  # 调用类属性

#类调用
Student.add(20,30)

#实例对象调用类方法
s1 = Student("Tom",19)
s1.add(20,30)

复制代码
  1. Python解释器已经在前面的运行中,堆内存创建Student类
  2. Student类里面我们添加一个静态方法add()
  3. 通过Student(“Tom”,19)在堆内存创建实例对象s1
  4. 静态方法add()可以通过类调用,也可以通过实例对象调用

静态方法实践

代码运行结果:

静态方法运行结果

总结

本期,我们学习了关于类相关的知识点,类对象、类属性和类方法。

在Python中类也是对象,数据类型是type类型,类属性也可以被实例对象使用。

类方法和静态方法不能访问实例属性,但是实例对象可以对它们进行调用。

好啦,以上是本期内容,欢迎大佬们评论区指正,下期1见~

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享