开发者社区> 雷学委> 正文

Python面向对象编程05:收尾总结一下类和对象

简介: 正式的Python专栏第40篇,同学站住,别错过这个从0开始的文章!
+关注继续查看

前篇学委展示分享了类的继承和重写,面向对象还有一些概念,继续跟上吧,这次总结一下!


类和对象再次认识回顾

类和对象,类就像是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__)

下面的运行结果务必看懂理解:

image.png

这里学委想表达的是,共享变量/函数,在内存中地址一样。


其他函数和变量,类被加载过之后,函数被加载,函数引用地址跟创建的对象的地址不一样!


同时类的数据属性,没有任何地址引用(因为类是没有数据属性赋值的),仅仅实例化为对象,我们才能通过对象来修改属性,对象是有状态的!


就像下面的图一样,当然内存地址只是虚构,未必连续!


image.png

总结

类和对象,一个就像是3D建模里面的模型数据,跟3D打印出来的模型。

但是3D打印没存在共享变量/共享函数,因为模型数据文件,跟打印出来的实物没有任何物质关联!

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【 JavaSE 】 类和对象(一)
类的定义方式以及对象的实例化 类中的成员变量和成员方法的使用 对象的整个初始化过程
10 0
Java性能优化之编程技巧总结
1、慎用异常 在Java软件开发中,经常使用 try-catch 进行错误捕获,但是,try-catch 语句对系统性能而言是非常糟糕的。
923 0
面向对象编程之类和对象的概念
首先需要明确,面向对象编程不是python独有的; 面向对象是一种编程思想; 在面向对象的思想中 > 万物都是对象
8 0
Python基础(面向对象编程)
其实比如str()这个内置函数,都是在内部调用__str__方法。 之所以提供str()这种方法大概是更简洁吧,有兴趣的可以去看一下源码。
2765 0
Python面对对象编程
2018年7月3日笔记 1.Python编程方式 面向过程:根据业务逻辑从上到下写代码 函数式:将某功能代码封装到函数中,日后便无需重复填写,仅调用函数即可 面对对象:对函数进行分类和封装,让开发"更好更快更强"。
991 0
(七)java类和对象
   <span style="font-size:18px"> 一个类定义一个新的数据类型,也就是定义了一个逻辑框架,定义了它的成员之间的关系。可以通过这种类型来声明该类型的对象,通过new关键词来实例化对象,也就是为该类型的对象动态的分配物理内存空间,这个分配过程实在运行时发生的。内存空间是有限的,因此运行时分配内存有可能不成功,会造成运行时异常。<br>     声明时的变量存储的
992 0
类和对象
如何定义一个类:1.类的重要性:所有java程序都是以类class为组织单元的,是基本元素。2类是模子,确定对象将会拥有什么样的特征(属性)和行为(方法)。先有类才能够描述具体对象。3类的组成:属性和方法4定义一个类的顺序:a.定义类名:publi class 类名{内容},class是定义类的关键字。
564 0
python面向对象三要素
* 面向对象三要素 &gt; 封装: &gt; &gt;通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。 &gt; &gt; 继承: &gt;&gt; 继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。
15 0
+关注
雷学委
十年开发经验,欢迎关注【雷学委】微信公众号
120
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载