1, 不一样的列表
- list1 = ["a", "b", "c"]
- self, *args = list1
- print(self)
- print(args)
输出:
a
['b', 'c']
2, 改变 type 中的规则, 创建类: 类属性大写
- class UpperAttrMetaClass(type):
- def __new__(cls, class_name, class_parents, class_attrs):
- # 遍历属性字典, 把不是__开头的属性名字变为大写
- newAttr = {}
- for k, v in class_attrs.items():
- if not k.startswith("__"):
- newAttr[k.upper()] = v
- # 方法 1: 通过'type'来创建类对象
- # return type(class_name, class_parents, newAttr)
- # 方法 2: 复用 type.__new__方法创建类对象
- # return type.__new__(cls, class_name, class_parents, newAttr)
- # 方法 3: 使用 super 方法创建类对象
- return super(UpperAttrMetaClass, cls).__new__(cls, class_name, class_parents, newAttr)
- # python3 的用法
- class Foo(object, metaclass=UpperAttrMetaClass):
- bar = "bip"
- # 判断 Foo 类中是否有某个属性
- print(hasattr(Foo, 'bar'))
- print(hasattr(Foo, "BAR"))
- f = Foo()
- print(f.BAR)
输出:
False True bip
3,%s 字串格式化, 不用元组用字典
- str= """
- 第一个:%(delim)s
- 第二个:%(id)s
- """str_new = str % {'delim':"$",'id': 9}
- print(str_new)
输出:
第一个:$
第二个: 9
4, 没有参数抛出异常
- def func1(*args, **kwargs):
- if not args: # 无参数报错
- raise TypeError("descriptor'format'of'Formatter'object needs an argument")
- else:
- n_args = len(args)
- pattern = "".join("%s," for x in range(n_args))
- # print(pattern)
- return "I am func1, my args is:" + pattern % args
- if __name__ == '__main__':
- # 有参数正常
- res1 = func1("a1", "a2", "a3")
- print(res1)
- # 无参数报错
- res2 = func1()
- print(res2)
输出:
- I am func1, my args is: a1, a2, a3,
- Traceback (most recent call last):
- File "D:/aaa-py/tmp/my00-tool.py", line 17, in
- res2 = func1()
- File "D:/aaa-py/tmp/my00-tool.py", line 3, in func1
- raise TypeError("descriptor'format'of'Formatter'object needs an argument")
- TypeError: descriptor 'format' of 'Formatter' object needs an argument
来源: http://www.bubuko.com/infodetail-2784605.html