Python小tips和学习整理

别等时光非礼了梦想. 提交于 2019-12-11 05:17:38

在类中单下划线_或双下划线开头的函数和变量的意义

  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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!