关于 if __name__ = "__main__" 的作用与认识

今天在项目中遇见了几次 if name = “main“: 虽然知道这代表着代码的入口,但更具体的信息却并不了解太多,于是 google 了后记录下对此的认识。

python 文件具有两种使用方法:
  可以作为一个脚本直接去运行,例如我的第一个’hellow world’ python程序;
  也可以作为一个模块被其他文件导入;
而 if name = “main“: 就是为了区分这两种情况避免引起不必要的错误。

举个例子:
/home
——-test:
————-__init__.py
————-test1.py
——-test2.py

#/home/test/test1.py
def run():
    print("The program is running...")

run()

python3 /home/test/test1.py
The program is running...

#/home/test2.py
from test import test1
print("i am test2.py")


python3 /home/test2.py
The program is running...
i am test2.py

看起来是不是很奇怪,test2.py 文件中我只是想打印一句话,但是运行时却将我 test1.py 中函数里的输出也给打印出来了。这是与我们期望是不符的。

下面我们为test1.py修改一下来防止这种情况发生

#/home/test/test1.py
def run():
    print("The program is running...")

if __name__ = '__main__':
    run()

这样再次运行就不会出现上述的情况了。而且作为脚本运行的话也不会出现什么错误。

这样例子一看就能很清楚的知道 if __name__ = ‘__main__’ 的功能了,他就类似于一个入口程序,当是直接运行文件时才会执行下面的语句,否则的话是不执行的。

那么为什么一行简单的代码能够实现这么神奇的作用呢?

我们知道每个模块都包含有一些内置属性,比如 __name__ , 通过这个属性我们可以获得模块名称(不包含 .py 后缀)。当模块是被直接执行的,那么 __name__ 的值就是 ‘main’。所以我们可以借此来判断模块运行时是直接运行的还是作为包被导入的。

在Java中,可以使用反射机制来判断对象中每一个字段是否为空。具体的实现方法如下: 1. 使用Class类的getDeclaredFields()方法获取对象的所有字段。 2. 遍历所有字段,使用Field类的get()方法获取字段的值。 3. 判断字段的值是否为null或者空字符串,如果是则表示该字段为空。 下面是一个示例代码: ```java import java.lang.reflect.Field; public class ObjectUtils { public static boolean isAllFieldsEmpty(Object obj) throws IllegalAccessException { if (obj == null) { return true; } for (Field field : obj.getClass().getDeclaredFields()) { field.setAccessible(true); Object value = field.get(obj); if (value != null && !value.toString().isEmpty()) { return false; } } return true; } } ``` 使用该方法可以判断对象中是否所有字段都为空。例如: ```java public class Person { private String name; private Integer age; private String address; // getter and setter ... } public class Test { public static void main(String[] args) throws IllegalAccessException { Person person1 = new Person(); person1.setName(""); person1.setAge(null); person1.setAddress(""); Person person2 = new Person(); person2.setName(null); person2.setAge(null); person2.setAddress(null); System.out.println(ObjectUtils.isAllFieldsEmpty(person1)); // true System.out.println(ObjectUtils.isAllFieldsEmpty(person2)); // true } } ``` 上述示例中,Person类中有三个字段:name、age、address。通过设置不同的属性值,可以测试ObjectUtils.isAllFieldsEmpty()方法的正确性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值