前篇学委展示分享了类的继承和重写,面向对象还有一些概念,继续跟上吧,这次总结一下!
类和对象再次认识回顾
类和对象,类就像是3D建模里面的模型数据,对象跟用这个3D模型使用3D打印出来的具体模型。
类没有生命周期,因为你的代码写好了类,它就存在,并不因为被不被加载而存在!
但是我们没有加载类到PYTHONPATH中,它不被找到!但是不代表它不存在!
对象呢?仅存在于Python程序运行过程中,中间程序关闭了,对象就消失了。
对象有生命周期
对象被创建,被惦记着(使用),被销毁了。(Python有对应的函数)
类和对象之间的数据共享
这就跟一家人住在一个房子里面一样,整个房子的设施是共享的,这样子类比。
先补充一个知识点:@staticmethod
这是python内置的一个函数修饰符,用来装饰函数的,也就是在函数的上方。
比如下面的代码:
class LeiXueWeiDemo(): @staticmethod def call_without_object_creation(): print("Run....") #调用代码: LeiXueWeiDemo.call_without_object_creation()
看看下面的程序:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/11/15 11:58 下午 # @Author : LeiXueWei # @CSDN/Juejin/Wechat: 雷学委 # @XueWeiTag: CodingDemo # @File : __init__.py.py # @Project : hello class Value(object): pass """ 下面是一个程序员类定义 """ class PythonProgrammer(object): class_value = Value() def __init__(self, name): self.name = name def code(self): print(f"{self.name}: life is too short, why not python?") @staticmethod def learn(self): print(f"{self.name}: learn python") def __str__(self): return f"PythonProgrammer(name:{self.name})" def __eq__(self, other): if isinstance(other, self.__class__): return self.name == other.name return False p1 = PythonProgrammer("学委粉丝2号") # p.code() #TypeError: code() missing 1 required positional argument: 'lang' p1.code() print("pi id:", id(p1)) print("PythonProgrammer id:", id(PythonProgrammer)) print("p1:", p1.name) print("class_value id:", id(p1.class_value)) print("PythonProgrammer.class_value id:", id(PythonProgrammer.class_value)) print("p1.__dict__:", p1.__dict__) print("p1.code:", p1.code) print("PythonProgrammer.code:", PythonProgrammer.code) print("p1.learn:", p1.learn) print("PythonProgrammer.learn:", PythonProgrammer.learn) print("p1的类型:", p1.__class__) print("PythonProgrammer命名空间:", PythonProgrammer.__dict__) print("PythonProgrammer类:", PythonProgrammer.__class__)
下面的运行结果务必看懂理解:
这里学委想表达的是,共享变量/函数,在内存中地址一样。
其他函数和变量,类被加载过之后,函数被加载,函数引用地址跟创建的对象的地址不一样!
同时类的数据属性,没有任何地址引用(因为类是没有数据属性赋值的),仅仅实例化为对象,我们才能通过对象来修改属性,对象是有状态的!
就像下面的图一样,当然内存地址只是虚构,未必连续!
总结
类和对象,一个就像是3D建模里面的模型数据,跟3D打印出来的模型。
但是3D打印没存在共享变量/共享函数,因为模型数据文件,跟打印出来的实物没有任何物质关联!