Python中if __name__ == ‘__main__‘,__init__和self 的解析
一、 if __name__ == '__main__'
if __name__ == '__main__'的意思是:
当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;
当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。
1.1、一个 xxx.py 文件被其他 xxx.py 文件引用
创建一个const.py文件:
PI = 3.14def main():print("PI:", PI)
main()
# 运行结果:PI: 3.14
写一个用于计算圆面积的area.py文件,area.py文件需要用到const.py文件中的PI变量。从const.py中,我们把PI变量导入area.py:
from const import PIdef calc_round_area(radius):return PI * (radius ** 2)def main():print("round area: ", calc_round_area(2))main()'''
运行结果:
PI: 3.14
round area: 12.56
'''
1.2 修改const.py,添加if __name__ == '__main__'
我们看到const.py中的main函数也被运行了,实际上我们不希望它被运行,因为const.py提供的main函数只是为了测试常量定义。这时if __name__ == '__main__'派上了用场,我们把const.py改一下,添加if __name__ == '__main__'
PI = 3.14def main():print("PI:", PI)if __name__ == "__main__":main()运行结果
PI: 3.14
导入const.py,运行area.py:
输出结果:
round area: 12.56#不显示:PI: 3.14
二、__init__与self
2.1 Python中self的含义
self,英文单词意思很明显,表示自己,本身。python的self,是个对象(Object),是当前类的实例
2.2 Python中为何要有self
在定义一个类时,首先需要定义一个构造函数。构造函数是用来初始化对象的属性的。在Python中,构造函数的第一个参数通常是self。self代表当前的对象实例,可以用来引用该对象的属性和方法。
在Python中,如果要使用一个对象的属性或方法,首先需要实例化对象。实例化对象是指创建一个对象的实例,也就是根据类创建一个具体的对象。在实例化对象时,通常需要传入一些参数来初始化对象的属性。
Python中就规定好了,函数的第一个参数,就必须是实例对象本身,并且建议,约定俗成,把其名字写为self
2.3_init__方法的作用:
__init__ 方法是 Python 中面向对象编程中类的特殊方法,也称为构造方法,当创建一个类的实例时,__init__ 方法会自动调用。
它的主要作用是初始化实例的属性,实例变量是对象的属性,用于存储数据。在实例被创建后,你可以通过这些属性对实例进行操作。每个类可以定义多个不同的 __init__ 方法,但通常情况下,在类中只有一个,在这种情况下,在创建类的实例时,必须提供所需的参数。
def __init__(self, 参数1, 参数2, ...):初始化语句1初始化语句2...
实例:在类中使用 init 方法初始化类的属性
class Dog:def __init__(self, breed, name, age):self.breed = breedself.name = nameself.age = agedog = Dog("Labrador", "Max", 3)print(dog.breed) # Output: Labrador
print(dog.name) # Output: Max
print(dog.age) # Output: 3
在这个例子中,我们创建了一个名为 Dog 的类,并且定义了 init 方法。 init 方法接收三个参数:breed, name 和 age,并且通过 self. 前缀来设置类的属性。最后,我们创建了一个名为 dog 的对象,并且初始化了它的 breed, name 和 age 属性。
2.4__init__()和self对象
class Person(object):def __init__(self, name, lang, website):self.name = nameself.lang = langself.website = websiteprint('self: ', self)print('type of self: ', type(self))
'''
未实例化时,运行程序,构造方法没有运行
'''p = Person('Tim', 'English', 'www.universal.com') '''实例化后运行的结果
self: <__main__.Person object at 0x00000000021EAF98>
type of self: <class '__main__.Person'>
'''
可以看出self为实例变量p,是一个Person类型的对象
class Dog(object): def __init__(self,name,dog_type):self.name = nameself.type = dog_typedef sayhi(self):print("hello,I am a dog, my name is ",self.name)d = Dog('LiChuang',"京巴") # 实例化
d.sayhi()
以下是d = Dog('LiChuang',"京巴")实例化的示意图:
2.5 如果没有在__init__中初始化对应的实例变量的话,导致后续引用实例变量会出错
如下代码,完整的演示了,如果没有在类Class的最初的__init__函数中,正确的初始化实例变量,则会导致后续没有变量可用,因而出现AttributeError的错误:
name = 'whole global name'
'''
注:此处全局的变量名,写成name,只是为了演示而用
实际上,好的编程风格,应该写成gName之类的名字,
以表示该变量是Global的变量
'''class Person(object):def __init__(self, newPersonName):# self.name = newPersonName'''如果此处不写成self.name那么此处的name,只是__init__函数中的局部临时变量name而已和全局中的name,没有半毛钱关系'''name = newPersonName'''此处只是为了代码演示,而使用了局部变量name,不过需要注意的是,此处很明显,由于接下来的代码也没有利用到此处的局部变量name则就导致了,此处的name变量,实际上被浪费了,根本没有利用到'''def sayYourName(self):'''此处由于找不到实例中的name变量,所以会报错:AttributeError: Person instance has no attribute 'name''''print('My name is %s' %self.name)def selfAndInitDemo():personInstance = Person('Tim')personInstance.sayYourName()if __name__ == '__main__':selfAndInitDemo()''' 未使用self.name时抛异常
Traceback (most recent call last):File "E:/python14_workspace/s14/day06/test_1.py", line 18, in <module>selfAndInitDemo()File "E:/python14_workspace/s14/day06/test_1.py", line 15, in selfAndInitDemopersonInstance.sayYourName()File "E:/python14_workspace/s14/day06/test_1.py", line 11, in sayYourNameprint('My name is %s' %self.name)
AttributeError: 'Person' object has no attribute 'name'
'''
从上述代码可见,由于在类的初始化(实例化)的__init__函数中,没有给self.name设置值,使得实例中,根本没有name这个变量,导致后续再去访问self.name,就会出现AttributeError的错误了。
对应的,如果写成self.name,则意思就正确了,就是初始化的时候,给实例中新增加,并且正常设置了正确的值newPersionName了,所以后续再去通过self.name,就可以访问到,当前实例中正确的变量name了。
相应的正确写法的代码如下:
name = 'whole global name'
'''
注:此处全局的变量名,写成name,只是为了演示而用
实际上,好的编程风格,应该写成gName之类的名字,
以表示该变量是Global的变量
'''class Person(object):def __init__(self, newPersonName):self.name = newPersonName'''此处正确的,通过访问self.name的形式,实现了:1.给实例中,增加了name变量2.并且给name赋了初值,为newPersionName'''def sayYourName(self):'''此处由于开始正确的初始化了self对象,使得其中有了name变量,所以此处可以正确访问了name值了'''print('My name is %s' %self.name)def selfAndInitDemo():personInstance = Person('Tim')personInstance.sayYourName()if __name__ == '__main__':selfAndInitDemo()'''My name is Tim'''
相关文章:

Python中if __name__ == ‘__main__‘,__init__和self 的解析
一、 if __name__ __main__ if __name__ __main__的意思是: 当.py文件被直接运行时,if __name__ __main__之下的代码块将被运行; 当.py文件以模块形式被导入时,if __name__ __main__之下的代码块不被运行。 1.1、一个 xxx.p…...

【Superset】自定义授权认证,接入内部系统二次开发
想要将内部系统认证与superset打通,必须要了解superset的认证体系。 Superset的认证体系 Superset的认证体系可以通过以下几种方式进行配置: 基于LDAP认证:Superset可以集成LDAP以验证用户身份。在这种情况下,Superset将根据LDAP…...

私有云:【1】ESXI的安装
私有云:【1】ESXI的安装 1、使用VMware Workstation创建虚拟机2、启动配置虚拟机3、登录ESXI管理台 1、使用VMware Workstation创建虚拟机 新建虚拟机 选择典型安装 稍后安装操作系统 选择VMware ESXI 选择虚拟机安装路径 硬盘设置300G或者更多 自定义硬件 内存和处…...

Mac怎么删除文件和软件?苹果电脑删除第三方软件方法
Mac删除程序这个话题为什么一直重复说或者太多人讨论呢?因为如果操作不当,可能会导致某些不好的影响。因为Mac电脑如果有太多无用的应用程序,很有可能会拖垮Mac系统的运行速度。或者如果因为删除不干净,导致残留文件积累在Mac电脑…...

【开题报告】基于微信小程序的旅游攻略分享平台的设计与实现
1.研究背景及意义 旅游已经成为现代人生活中重要的组成部分,人们越来越热衷于探索新的目的地和体验不同的文化。然而,对于旅游者来说,获取准确、可靠的旅游攻略信息并不容易。传统的旅游攻略书籍或网站往往无法提供实时、个性化的建议。因此…...

布隆过滤器(Bloom Filter)初学习
目录 1、布隆过滤器是什么 2、布隆过滤器的优缺点 3、使用场景 4、⭐基于Redis的布隆过滤器插件安装 4.1 下载布隆过滤器 4.2 创建文件夹并上传文件 4.3 安装gcc 4.4 解压RedisBloom压缩包 4.5 在解压好的文件夹下输入make 4.6 将编译的好的插件拷贝到docker redis容…...

“深入探讨操作系统和虚拟化技术“
目录 引言1.操作系统1.1.什么是操作系统1.2.常见操作系统1.3.个人版本和服务器版本的区别1.4.Linux的各个版本 2.安装VMWare虚拟机1.VMWare虚拟机介绍2.VMWare虚拟机安装3.VMWare虚拟机配置 3.安装配置Windows Server 2012 R24.完成电脑远程访问电脑5.服务器环境搭建配置jdk配置…...

远程连接异地主机可能遇到的问题及处理
0.现状 公司的一套系统内部有多个节点的内网,要把数据上传至客户的办公网环境中的服务器。客户办公网为我们提供了一台类似路由的设备,办公网无法让内网地址的数据包透传至服务器。现场条件所限,只有有限数量的技术服务人员可以维持…...

使用 PointNet 进行3D点集(即点云)的分类
点云分类 介绍 无序3D点集(即点云)的分类、检测和分割是计算机视觉中的核心问题。此示例实现了开创性的点云深度学习论文PointNet(Qi 等人,2017)。 设置 如果使用 colab 首先安装 trimesh !pip install trimesh。 import os import glob import trimesh import numpy as…...

高通平台GPIO引脚复用指导
高通平台GPIO引脚复用指导 1. 概述1.1 平台有多少个GPIO?1.2 这些GPIO都有哪些可复用的功能? 2. 软件配置2.1 TZ侧GPIO配置2.2 SBL侧GPIO配置2.3 AP侧GPIO配置2.3.1 Linux DTS机制与设备驱动模型概述2.3.2高通平台的pinctrl控制器2.3.2.1 SDX12 CPU pinc…...

华为机试题:HJ5 进制转换
目录 第一章、算法题1.1)题目描述1.2)解题思路与答案1.3)派仔的解题思路与答案1.3)牛客链接 友情提醒: 先看文章目录,大致了解文章知识点结构,点击文章目录可直接跳转到文章指定位置。 第一章、算法题 1.…...

面试算法37:小行星碰撞
题目 输入一个表示小行星的数组,数组中每个数字的绝对值表示小行星的大小,数字的正负号表示小行星运动的方向,正号表示向右飞行,负号表示向左飞行。如果两颗小行星相撞,那么体积较小的小行星将会爆炸最终消失…...

ROS学习记录2018.7.10
ROS学习记录2018.7.10 1.ROS基础了解 开源机器人操作系统ROS(robot operation system) 分级: 1.计算图集(一种网络结构) 1.节点:执行运算的进程(做基础处理的单元)2.消息&#x…...

OPC UA:工业领域的“HTML”
OPC UA是工业自动化领域的一项重要的通信协议。它的特点是包括了信息模型构建方法。能够建立工业领域各种事物的信息模型。在工业自动化行业,OPCUA 类似互联网行业的HTTP协议和“HTML”语言。能够准确,可靠地描述复杂系统中各个元素,并且实现…...

【golang】Windows环境下Gin框架安装和配置
Windows环境下Gin框架安装和配置 我终于搞定了Gin框架的安装,花了两三个小时,只能说道阻且长,所以写下这篇记录文章 先需要修改一些变量,这就需要打开终端,为了一次奏效,我们直接设置全局的: …...

多测师肖sir_高级金牌讲师__接口测试之tonken (5.6)
接口测试之tonken 网站:http://shop.duoceshi.com/login?redirect2Fdashboard 第一个接口:uiid接口 uiid接口url:http://manage.duoceshi.com/auth/code test中语句: var jsonData JSON.parse(responseBody); postman.setEnvi…...

C++常见面试问题之内存对齐
一、内存对齐是什么 1.内存对齐是什么 还是用一个例子带出这个问题,看下面的小程序,理论上,32位系统下,int占4byte,char占一个byte,那么将它们放到一个结构体中应该占415byte;但是实际上&…...

网络协议--TCP:传输控制协议
17.1 引言 本章将介绍TCP为应用层提供的服务,以及TCP首部中的各个字段。随后的几章我们在了解TCP的工作过程中将对这些字段作详细介绍。 对TCP的介绍将由本章开始,并一直包括随后的7章。第18章描述如何建立和终止一个TCP连接,第19和第20章将…...

网络协议--BOOTP:引导程序协议
16.1 引言 在第5章我们介绍了一个无盘系统,它在不知道自身IP地址的情况下,在进行系统引导时能够通过RARP来获取它的IP地址。然而使用RARP有两个问题:(1)IP地址是返回的唯一结果;(2)…...

33基于MATLAB的对RGB图像实现中值滤波,均值滤波,维纳滤波。程序已通过调试,可直接运行。
基于MATLAB的对RGB图像实现中值滤波,均值滤波,维纳滤波。程序已通过调试,可直接运行。 33 MATLAB、图像处理、维纳滤波 (xiaohongshu.com)...

WPF十六(页面内嵌加载)
在WPF中进行页面内嵌的加载 当存在一定需求时,比如当前页面C左侧是一个A页面,右侧是一个B页面,A页面是一个公用页面时,此时只需要做内嵌A页面,然后B页面进行正常处理,既可以节省时间,又做到了WP…...

JAVA基础(JAVA SE)学习笔记(九)异常处理
前言 1. 学习视频: 尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第三阶段:Java高级应用 9.异常处理 10.多线程 11.常用类和基础API 12.集合框架 13.泛型 14…...

Miniconda、Vscode下载和conda源、pip源设置
1、常用软件下载 1、Miniconda软件下载: windows网址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/?CS&OA 2、最新版Miniconda下载网址:https://docs.conda.io/projects/miniconda/en/latest/ 3、常用代码编辑器VsCode下…...

CAN接口的PCB Layout规则要求汇总
随着时代高速发展,控制器局域网(CAN)接口的应用越来越广泛,尤其是在汽车电子、航空航天等领域中发挥着重要作用,为了确保CAN接口的可靠性和稳定性,工程师必须在其PCB Layout方面下功夫,下面来看…...

IP网络矿用打点紧急广播方案
IP网络矿用打点紧急广播方案 一、概述 目前,随着计算机网络技术的迅速普及,信息化已经走向煤矿。很多煤矿都陆续具有了稳定可靠、覆盖矿井上下的工业以太网。科学技术的不断进步和信息化矿山建设步伐的不断加快,井下工业以太网将逐渐得到推…...

系列六、FactoryBean vs ApplicationContext
一、FactoryBean vs ApplicationContext 1.1、概述 BeanFactory是一个工厂类,负责生产和管理bean,在Spring中BeanFactory是IOC容器的核心接口,它的主要职责就是生产bean及建立各个bean之间的依赖。applicationContext是BeanFactory的一个子接…...

AOP简单使用模版
AOP面向切面编程 切面类的定义之模版 package com.xie.service;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.*; import org.aspectj.lang.ProceedingJoinPoint; import org.springframework.stereotype.Component; import javax.servlet.http.Http…...

手机注册.
<!DOCTYPE html> <html><head><title>注册</title><meta http-equiv"content-type" content"text/html; charsetutf-8"/><meta name"apple-mobile-web-app-capable" content"yes"/><lin…...

PostgreSQL 17新特性之登录事件触发器
PostgreSQL 9.3 就提供了事件触发器功能,可以基于 DDL 语句触发相应的操作。 正在开发中的 PostgreSQL 17 增加了基于登录事件的触发器,可以在用户登录时执行某些检查或者特定操作。登录事件触发器的使用方法和其他触发器一样:创建一个返回 …...

Docker 搭建 LNMP + Wordpress
[TOC](Docker 搭建 LNMP Wordpress 一、项目介绍1.1、项目环境1.2、 服务器环境1.3、 任务需求 二、部署Nginx2.1、建立工作目录2.2、 编写 Dockerfile 脚本2.3、准备 nginx.conf 配置文件2.4、生成镜像2.5、创建自定义网络 三、部署Mysql3.1、建立工作目录3.2、编写 Dockerfi…...