Python学习基础笔记四十九——类的命名空间

news2024/11/24 16:53:56

1、创建一个类就创建了一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性。而类中可以定义两种属性:

静态属性:就是直接在类中定义的变量。

动态属性:就是定义在类中的方法。

class Course:
    language = 'Chinese'

    def __init__(self, name, teacher, period, price):
        self.name = name
        self.teacher = teacher
        self.period = period
        self.price = price

    def getname(self):
        return self.name

    def getteacher(self):
        return self.teacher


python = Course('Python', 'Chang', '6 month', 20000)
ret = python.getname()
print('The python course name is: ', ret)

linux = Course('Linux', 'Shen', '3 month', 10000)
ret = linux.getteacher()
print('The teacher of linux course is: ', ret)

总结一点:我们通过类,其实是规范了一些对象,让这些对象有规律可循。

创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性。

在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常

a = 1

class A:
    # a
    # A.a

2、类中是不能通过__dict__来修改静态属性。

而对象属性是可以通过“对象名.__dict__['属性名'] = 新属性值”来进行修改的。

class Course:
    language = 'Chinese'

    def __init__(self, name, teacher, period, price):
        self.name = name
        self.teacher = teacher
        self.period = period
        self.price = price

    def getname(self):
        return self.name

    def getteacher(self):
        return self.teacher

# 创建一个python课程对象
python = Course('Python', 'Chang', '6 month', 20000)

# 修改静态属性
Course.language = 'English'
print(Course.language)

# 检查是否可以使用__dict__来修改
Course.__dict__['language'] = 'English'

# 通过__dict__来修改对象属性
python.__dict__['name'] = 'BigPython'
print(python.getname())

3、通过对象名来调用静态属性:

class Course:
    language = 'Chinese'
    # 打印language属性的内存地址
    print(id(language))

    def __init__(self, name, teacher, period, price):
        self.name = name
        self.teacher = teacher
        self.period = period
        self.price = price

    def getname(self):
        return self.name

    def getteacher(self):
        return self.teacher


# 创建一个python课程对象
python = Course('Python', 'Chang', '6 month', 20000)
ret = python.getname()
print('The python course name is: ', ret)


# 通过对象名来调用静态属性:
print(python.language)    # 返回值Chinese

# 打印python对象中的language的内存地址
print(id(python.language))   # 从结果可以看出两者是一样

通过id来打印类的language的内存地址和python对象的language属性的内存地址,可以看到是同一个。

 

总结下:类中的静态对象,类和对象两者都可以来调用。静态属性应该是类共性的一个东西,每个实例化对象都拥有这个共性的属性。

4、对象之间是平行关系,没有交集。两个对象可以共用同一个静态变量。

5、通过某个对象修改类变量,检查类变量和其他对象的同变量是否发生变化。

class Course:
    language = 'Chinese'

    def __init__(self, name, teacher, period, price):
        self.name = name
        self.teacher = teacher
        self.period = period
        self.price = price

    def getname(self):
        return self.name

    def getteacher(self):
        return self.teacher


# 创建一个python课程对象
python = Course('Python', 'Chang', '6 month', 20000)
ret = python.getname()
print('The python course name is: ', ret)

# 创建一个linux课程对象
linux = Course('Linux', 'Shen', '3 month', 10000)
ret = linux.getteacher()
print('The teacher of linux course is: ', ret)

# 通过对象来修改类变量
python.language = 'Spalish'

# 该python对象可以看到language变量发生了修改
print(python.language)

# 再检查其他对象,还是language还是Chinese
print(linux.language)

# 再检查类变量language,还是Chinese
print(Course.language)

结论:对于不可变数据类型来说,类变量最好用类名操作。

6、对可变数据类型:

class Course:
    language = ['Chinese']

    def __init__(self, name, teacher, period, price):
        self.name = name
        self.teacher = teacher
        self.period = period
        self.price = price

    def getname(self):
        return self.name

    def getteacher(self):
        return self.teacher


# 创建一个python课程对象
python = Course('Python', 'Chang', '6 month', 20000)
# ret = python.getname()
# print('The python course name is: ', ret)

# 创建一个linux课程对象
linux = Course('Linux', 'Shen', '3 month', 10000)
# ret = linux.getteacher()
# print('The teacher of linux course is: ', ret)

# 通过对象来修改类变量列表中的元素
python.language[0] = 'English'

# 该python对象可以看到language变量发生了修改
print(python.language)

# 再检查其他对象,还是language还是Chinese
print(linux.language)

# 再检查类变量language,还是Chinese
print(Course.language)

在类中开辟了一个language的内存地址,这个内存地址指向一个列表,但是列表里的元素发生了变化。所以都发生了变化。

那我们再修改下程序:

class Course:
    language = ['Chinese']

    def __init__(self, name, teacher, period, price):
        self.name = name
        self.teacher = teacher
        self.period = period
        self.price = price

    def getname(self):
        return self.name

    def getteacher(self):
        return self.teacher


# 创建一个python课程对象
python = Course('Python', 'Chang', '6 month', 20000)
# ret = python.getname()
# print('The python course name is: ', ret)

# 创建一个linux课程对象
linux = Course('Linux', 'Shen', '3 month', 10000)
# ret = linux.getteacher()
# print('The teacher of linux course is: ', ret)

# 通过对象来修改类变量,指向了另外一个列表对象
python.language = ['English']

# 该python对象可以看到language变量发生了修改
print(python.language)

# 再检查其他对象,还是language还是Chinese
print(linux.language)

# 再检查类变量language,还是Chinese
print(Course.language)

对于可变数据类型来说,通过对象名的静态对象元素进行修改是共享的,重新赋值是独立的。

7、创建一个类,每实例化一个对象就记录下来,最终所有对象都共享这个数据。

class Foo:
    count = 0

    def __init__(self):
        Foo.count += 1


f1 = Foo()
f2 = Foo()

print(f1.count)
print(f2.count)

print(Foo.count)

这个类变量记录下实例化对象的数量。这个就是利用了类变量的一个例子。

8、函数的名字跟静态属性的名字不要重名。

class Foo:
    count = 0
    def count(self):
        pass

count函数名其实也有一个内存空间。

9、绑定方法:

def func(): pass


print(func)


class Foo:
    def func(self):
        print('func')


f1 = Foo()
print(Foo.func)
print(f1.func)
print(f1)

当对象名调用类中定义的方法时,才有绑定方法,就是把对象的值通过self参数给了这个方法。

10、包package和__init__的关系:

import time

time.time()     # 导入一个time包,然后就可以使用time对象中的方法time(), 就有一个实例化的过程。

 import time,就相当于类的实例化的过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89549.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

直播基本流程【推流-播流-流媒体服务器】

直播基本流程 这里不涉及到业务相关 , 这里简要说明直播流程 推流端: 负责将本地的音视频数据推送至流媒体服务器 流程:音视频数据采集->编码->封装->协议封包 功能:美颜滤镜、音效处理、回音消除 播流端&#xff1…

SpringBoot2核心技术(核心功能)- 04、配置文件【4.1 yaml的用法 + 4.2 自定义类绑定的配置提示】

核心功能概览 1、文件类型 1.1、properties 同以前的properties用法 1.2、yaml 1.2.1、简介 YAML 是 “YAML Ain’t Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet An…

猿如意中的【editorconfig-222.2889.3】工具详情介绍

一、工具名称 editorconfig-222.2889.3 二、下载安装渠道 editorconfig-222.2889.3 通过CSDN官方开发的【猿如意】客户端进行下载安装。 2.1 什么是猿如意? 猿如意是一款面向开发者的辅助开发工具箱,包含了效率工具、开发工具下载,教程文…

《Fluent Python》笔记 | 协程

生成器作为协程 协程是指一个过程, 这个过程与调用方协作, 产出由调用方提供的值。 协程使用的简单演示(用作协程的生成器): >>> def simple_coroutine(): # 生成器函数 ... print(-> coroutine starte…

JavaScript系列之通过babel体验ES6模块化

文章の目录一、创建项目文件夹二、打开cmd窗口三、初始化项目四、安装依赖模块五、项目根目录创建文件六、在babel.config.js 文件中添加如下配置七、编写代码八、执行代码九、相关项目依赖写在最后一、创建项目文件夹 名称不要使用中文,不能使用 babel&#xff0c…

[附源码]计算机毕业设计的旅游景点管理系统的设计与实现Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis MavenVue等等组成,B/S模式…

VS Code —— 介绍如何配置快捷代码片段和一些自用插件

VS Code —— 介绍如何配置快捷代码片段和一些自用插件 《工欲善其事,必先利其器》—— 既然点进来了,麻烦你看下去,希望你有不一样的收获~ 一、配置代码片段 打开 VS Code,输入快捷键 Ctrl Shift p,打开面板&#…

继真人秀后的又一次大赛,万应低代码一路向前

12月8日,凛冬的长沙,比赛现场暖气充足,11 个参赛团队的队长正在台下跃跃欲试,本届“万应杯”低代码应用开发大赛已经开启月余,大家都很期待能在淘汰赛上一展身手。 他们手上的项目,涉及到建筑、园区、生鲜…

30、基于51单片机的数字电压表(ADC0809)(Proteus仿真+程序)

编号:30 基于51单片机的数字电压表(ADC0809) 功能描述: 本设计由51单片机最小系统ADC0809模块八路路模拟量输入模块12864显示模块 1、主控制器是89C52单片机 2、ADC0809模数转换器进行A/D转换,读取电压八路数据&…

现在转行码农的成本已经非常高了,别盲目转行..

转行码农一直是个比较火热的话题,也有很多读者咨询过这个问题,转成功的也不少,比如下面这位香港的同学: 这位朋友半年前就跟我聊过,他不太想干没有技术含量的体力活,一直在坚持自学,这也算如愿…

软件测试基础知识总结(面试临时抱佛脚)

之前有将基础的软件测试知识做了一个总结,但比较潦草,很多内容只是一笔带过,快到年底了,自己也有个写年终知识总结文档的计划,就将基础的理论知识重新整理一番。。。 有人问我,这些都是能搜索到的知识&…

65-82-springcloud-gateway-config-bus

65-82-springcloud-gateway-config-bus: Gateway gateway官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/ 1、什么是gateway Gateway是在Spring生态系统之上构建的API网关服务,基…

c++引用

1.什么是c引用&#xff1f; 引用是c对c的重要扩充。c中新增了引用的概念&#xff0c;引用可以作为一个已定义变量的别名。 #include "stdafx.h" #include <iostream> using namespace std; // 1.引用的基本使用 void test01(){int a 10;// 给变量a取一个别名…

金仓数据库KingbaseES 归档日志清理

WAL是Write Ahead Log的简写&#xff0c;和Oracle的redo日志类似&#xff0c;在R3版本存放在data/sys_log中&#xff0c;R6版本以后在data/sys_wal目录&#xff0c;在数据库访问过程中&#xff0c;任何对数据块的修改都会记录到wal日志&#xff0c;并写入到wal文件保存到磁盘&a…

PMP有没有必要续证呢?

在还只看到标题的时候&#xff0c;我当时就觉得必须续啊&#xff0c;为什么不续&#xff0c;我花了那么多时间精力和钱财去考的&#xff0c;我自然得去给它续上&#xff0c;不然白拿了&#xff0c;才拿了三年我还没捂热就给我失效了多不值。 首先美国PMI要求PMP证书是三年一换…

面试题 :Unity编辑器基础

1、请描述游戏动画有几种&#xff0c;以及其原理。 关键帧动画&#xff1a;每一帧动画序列当中包含了顶点的空间位置信息以及改变量&#xff0c;然后通过插值运算&#xff0c;得出动画效果。选中某一游戏对象&#xff0c;创建animation&#xff0c;添加属性Transform&#xff0…

【Meetup 预告】OpenMLDB + MaxCompute:集成打通云上生态,高效构建 AI 应用

2022年12月3日&#xff08;周六&#xff09;上午10&#xff1a;00-12:00&#xff0c;开源机器学习数据库 OpenMLDB 第八期 Meetup 将通过线上直播的形式展开。 活动背景 数据的爆发式增长为 AI 应用的繁荣提供了坚实的基础&#xff0c;而云服务作为新一代快速整合、高效计算的…

STC-Seg:首个超越PointTrack的弱监督视频MOTS算法

弱监督视频多目标实例分割新SOTA&#xff08;代码已开源&#xff09;&#xff1a; Paper: Solve the Puzzle of Instance Segmentation in Videos: A Weakly Supervised Framework with Spatio-Temporal Collaboration Code: https://github.com/ylqi/STC-Seg 众所周知&#xf…

linux之syslog使用说明

syslog 系统日志应用 1) 概述 syslog默认的日志守护进程。默认的syslog配置文件是/etc/syslog.conf文件。程序&#xff0c;守护进程和内核提供了访问系统的日志信息。因此&#xff0c;任何希望生成日志信息的程序都可以向 syslog 接口呼叫生成该信息。 几乎所有的网络设…

【2台真机实战--Redis一主一从两哨兵配置集群和主从切换】

2台真机实战--Redis一主一从两哨兵配置集群和主从切换前言实战真实环境节点分布配置主服务器&#xff08;192.168.137.23&#xff09;配置redis.conf配置sentinel.conf从服务器&#xff08;192.168.137.24&#xff09;配置redis.conf配置sentinel.conf启动redis整合SpringBoot配…