这是我参与更文挑战的第 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()
复制代码
- 首先Python会在堆内存中创建数据类型为type的student类
- student类里面有包含类属性classname和teachername两个属性
- 实例属性不在类里,而是通过Student(“Tome”,19)创建的对象里
- 实例对象s1.information调用,可以调用类属性
代码运行结果为:
3. 类方法
3.1 类方法概念
类方法是从属于类对象的方法。类方法通过装饰器@classmethod来定义。
@classmethod
def 类方法名(cls,[形参列表]):
函数体
复制代码
-
@classmethod必须位于方法上面一行
-
第一个cls必须有,cls指的就是类对象本身
-
调用类方法格式:
类名.类方法名(参数列表) #参数列表中,不需要也不能给cls传值 复制代码
-
类方法中访问实例属性和实例方法会导致错误
-
子类继承父类方法时,传入cls是子类对象,而非父类对象
-
实例对象也能对类方法进行访问
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()
复制代码
- python解释器会在堆内存中创建Student类
- Student类里包含有类方法tearcher()
- 通过Student.tearcher()调用类方法
- 也可以通过s1.tearcher()对象来调用类方法
代码运行结果为:
4. 静态方法
Python 中允许定义与类对象无关的方法,称为静态方法。
静态方法和在模块中定义普通函数没有区别,只不过静态方法放到类的名字空间里面,需要通过“类调用”。
静态方法通过装饰器@staticmethod来定义,格式如下:
@staticmethod
def 静态方法名([形参列表]):
函数体
复制代码
- @staticmethod 必须位于方法上面一行
- 调用静态方法格式:类名.静态方法名(参数列表)
- 静态方法中访问实例属性和实例方法会导致错误
- 实例对象也能对静态方法进行调用
我们继续哪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)
复制代码
- Python解释器已经在前面的运行中,堆内存创建Student类
- Student类里面我们添加一个静态方法add()
- 通过Student(“Tom”,19)在堆内存创建实例对象s1
- 静态方法add()可以通过类调用,也可以通过实例对象调用
代码运行结果:
总结
本期,我们学习了关于类相关的知识点,类对象、类属性和类方法。
在Python中类也是对象,数据类型是type类型,类属性也可以被实例对象使用。
类方法和静态方法不能访问实例属性,但是实例对象可以对它们进行调用。
好啦,以上是本期内容,欢迎大佬们评论区指正,下期1见~
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END