Python小tips和学习整理
在类中单下划线_或双下划线开头的函数和变量的意义
Python在类中的函数和变量有以单下划线开头的命名(比如_getFile),也有以双下划线开头的命名(比如__filename),以及双下划线开头和结尾的命名(比如__init()__),这些命名都是带有特殊的意味的:
【1】以单下划线开头的函数或变量,被默认为是内部函数或变量。比如:
def get_model(config):
def _model_class(class_name):
.....
内部函数或变量一般只能在类中或内部使用,即比如使用from a_module import *
这样的方式导入时a_module中的变量和函数时,内部函数和变量不会被导入。
不过值得注意的是,如果使用import a_module
这样导入模块,那么仍然可以通过a_module._some_var
这样的形式访问其中的内部函数或变量。
【2】以单下划线结尾的函数或变量,通常用于和 Python 关键词区分开来,比如如果我们需要一个变量叫做 class
,但 class
是 Python 的关键词,就可以以单下划线结尾写作 class_
。
【3】以双下划线开头的函数或变量,双下划线开头的命名形式表示名字改编 (Name Mangling),即如果有一个 Test
类里有一成员 __x
,那么 dir(Test) 时会看到 _Test__x
而非 __x
。这是为了避免该成员的名称与子类中的名称冲突。但要注意这要求该名称末尾没有下划线。
【4】以双下划线开头和结尾的函数或变量,是一些 Python 的“魔术”对象,如类成员的 __init__、__del__、__add__、__getitem__
等,以及全局的 __file__、__name__
等。 Python 官方推荐永远不要将这样的命名方式应用于自己的变量或函数,而是按照文档说明来使用。
getattr()函数和与之相关的函数
getattr()
是Python的一个内置函数,多用于类的相关中,python里面跟getattr
相关的有hasattr、setattr、delattr
以如下代码来说明它的用法:
假设存在下面这个类Example
和实例化后的结果foo
:
class Example:
def __init__(self):
self.name = ‘fengyun’
def setName(self,name):
self.name = name
def getName(self):
return self.name
def greet(self):
print “Hello,i’m %s”%self.name
foo = Example()
hasattr(object, name)
它的作用是判断object
形参中是否具有name
形参这个属性(比如object
实例中是否有name
这个函数、变量),其使用方法如下示例:
foo = Example()
hasattr(foo, ’setName’) #判断foo中是否有setName这个函数或是变量存在,存在则返回True,否则返回False。
getattr(object, name, default)
如果object
形参中存在name
形参这个属性(或是方法),则返回name
形参这个属性的值(或是方法地址,注意不是返回属性,而是直接返回属性的值!),如果不存在name
形参这个属性(或是方法),则返回default
值。
foo = Example()
result = getattr(foo,’name’,’NA’) # foo目标中存在name属性,所以直接返回name的value给result
print(result) # ‘fengyun’
getattr(foo,’age’,’NA’) # foo目标中不存在age属性,所以返回default的值
‘NA’
setattr(object, name, default)
该函数的作用是在object形参中直接修改name属性(方法)的值,如果不存在name属性,则直接新建一个。
setattr(foo,’age’,’18’) # 类似foo.age = 18
delattr(object,‘name’)
该函数的作用是在object形参中直接删除name属性。
delattr(foo,’name’) # 删除属性name,原值为‘fengyun’
importlib.import_module()方法
这个方法在许多Python程序中都有调用,它的目的在于动态导入对象。
所谓的动态导入对象,指的是在我们的程序中,有选择性地导入当前需要的模块,用程序来举例:
假设文件结构为:
a #文件夹
│a.py
│__init__.py
b #文件夹
│b.py
│__init__.py
│c.py
#在b.c.py 中的代码内容如下:
args = {'a':1}
class C:
def c(self):
pass
我们需要在a.py文件中导入c.py中的对象,那么静态导入对象方法的代码为:
# 静态导入对象
# 在a.py文件中
import b.c
那么,无论我们当前状态下是否需要使用到c.py中的对象,我们都将它导入了,如果使用动态导入对象方法,它的代码为:
import importlib
params = importlib.import_module('b.c') # 动态导入对象
运行这段代码后,params
就相当于b.c
了,我们可以通过访问params
来访问b.c
中的对象,示例如下:
params.args # 取出c.py中的args变量
params.C # 取出c.py中的class C
params.C.c # 取出c.py中的 class C 中的c 方法
如果我们当前不需要使用c.py中的对象,需要使用b.py中的对象,那么我们只需要将importlib.import_module('b.c')
中的b.c
改成b.b
就可以了。
isinstance()方法
它的作用在于判断一个对象(这里的对象可以是函数、变量、类实例化的结果等等)是否是一个已知的类型,返回一个布尔型的值(True or False):
>>> a = 4
>>> isinstance (a,int)
True
>>> isinstance (a,str)
False
>>> isinstance (a,(str,int,list)) # 若参数二为一个元组,则若对象类型与元组中类型名之一相同即返回True
True
assert()断言宏
从本质上来说,assert是一个宏。它的作用是判断当前条件是否适合让程序继续运行,用法如下:
assert condition # condition是一个逻辑表达式 比如 a < 5
上面的代码相当于:
if not condition: # 如果条件不满足,就报错
raise AssertionError()
比如:
>>> assert 1==0 # 下面是运行结果
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
assert 1==0
AssertionError
当然,当条件不满足时,光提示我们AssertionError
是不够的,我们还希望知道解释断言并且更好地知道是哪里出现了问题,那么加入异常参数的assert用法如下:
assert expression [, arguments] # 一旦条件不满足,就显示后面的异常参数
其示例如下:
>>> assert len(lists) >=5, '列表元素个数小于5'
Traceback (most recent call last):
File "D:/Data/Python/helloworld/helloworld.py", line 1, in <module>
assert 2>=5,'列表元素个数小于5'
AssertionError: 列表元素个数小于5
来源:CSDN
作者:风雪夜归人o
链接:https://blog.csdn.net/qq_42079689/article/details/103453911