python 随笔

os.path.expanduser()

# 把path中包含的"~"和"~user"转换成用户目录
os.path.expanduser(path)	

Ref: Python os.path() 模块

@classmethod修饰符与 @staticmethod修饰符

@classmethod

class A(object):

    # 属性默认为类属性(可以给直接被类本身调用)
    num = "类属性"

    # 实例化方法(必须实例化类之后才能被调用)
    def func1(self): # self : 表示实例化类后的地址id
        print("func1")
        print(self)

    # 类方法(不需要实例化类就可以被类本身调用)
    @classmethod
    def func2(cls):  # cls : 表示没用被实例化的类本身
        print("func2")
        print(cls)
        print(cls.num)
        cls().func1()

    # 不传递传递默认self参数的方法(该方法也是可以直接被类调用的,但是这样做不标准)
    def func3():
        print("func3")
        print(A.num) # 属性是可以直接用类本身调用的
    
# A.func1() 这样调用是会报错:因为func1()调用时需要默认传递实例化类后的地址id参数,如果不实例化类是无法调用的
A.func2()
A.func3()

Java对比, python中被classmethod修饰符修饰的类方法类似于Java类中的静态方法,不需要实例化类,可以直接通过 类名.方法名的方式调用。
Ref: Python classmethod 修饰符

@staticmethod

@staticmethod静态方法只是名义上归属类管理,但是不能使用类变量和实例变量,是类的工具包
放在函数前(该函数不传入self或者cls),所以不能访问类属性和实例属性

class cal:
    cal_name = '计算器'
    def __init__(self,x,y):
        self.x = x
        self.y = y

    @property           #在cal_add函数前加上@property,使得该函数可直接调用,封装起来
    def cal_add(self):
        return self.x + self.y

                        #在cal_info函数前加上@classmethon,则该函数变为类方法,
    @classmethod        #该函数只能访问到类的数据属性,不能获取实例的数据属性
    def cal_info(cls):  #python自动传入位置参数cls就是类本身
        print('这是一个%s'%cls.cal_name)   #cls.cal_name调用类自己的数据属性

    @staticmethod       #静态方法 类或实例均可调用
    def cal_test(a,b,c): #改静态方法函数里不传入self 或 cls
        print(a,b,c)
c1 = cal(10,11)
cal.cal_test(1,2,3)     #>>> 1 2 3
c1.cal_test(1,2,3)      #>>> 1 2 3

pip 使用requirement.txt

为了便于新环境部署,python项目中需要包含一个 requirements.txt 文件,用于记录所有依赖包及其精确的版本号
requirements.txt可以通过pip命令自动生成和安装
生成requirements.txt文件

pip freeze > requirements.txt

安装requirements.txt依赖

pip install -r requirements.txt

查看pip 安装包列表

pip list

Ref

常用的__doc__、name、__file__的使用

  __doc__:获取到注释内容
  __name__:获取到函数的名称
  __file__:获取到当前的文件路径

Ref

* 和 ** 运算符

  1. 算数运算
  • 代表乘法
    ** 代表乘方
>>> 2 * 5
10
>>> 2 ** 5
32
  1. 函数可变长度形参(用于函数的形参个数不确定)
    可以将不定数量的参数传递给一个函数。其实并不是必须写成 *args 和 **kwargs。  *(星号) 才是必须的. 你也可以写成 *ar  和 k 。而写成 *args 和kwargs 只是一个通俗的命名约定。
    *args 与 **kwargs 的区别,两者都是 python 中的可变参数:
*args 表示任何多个无名参数,它本质是一个 tuple
**kwargs 表示关键字参数(key word args),它本质上是一个 dict

如果同时使用 args 和 **kwargs 时,args 参数列要在 **kwargs 之前

>>> def fun(*args, **kwargs):
...     print('args=', args)
...     print('kwargs=', kwargs)
... 
>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
args= (1, 2, 3, 4)
kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}

使用 *args

>>> def fun(name, *args):
...     print('你好:', name)
...     for i in args:
...         print("你的宠物有:", i)
... 
>>> fun("Geek", "dog", "cat")
你好: Geek
你的宠物有: dog
你的宠物有: cat

使用**kwargs

>>> def fun(**kwargs):
...     for key, value in kwargs.items():
...         print("{0} 喜欢 {1}".format(key, value))
... 
>>> fun(Geek="cat", cat="box")
Geek 喜欢 cat
cat 喜欢 box

Ref

原文地址:https://www.cnblogs.com/greatLong/p/12426744.html