一、对象表示形式
Python 提供了两种获取对象的字符串表示形式的标准方式。
- repr() : 以便于开发者理解的方式返回对象的字符串表示形式。
- str() : 以便于用户理解的方式返回对象的字符串表示形式。
二、classmethod 与 staticmethod
这两个是python内置提供的装饰器, 都是在类 class 定义中使用的。可以通过类直接调用,而不是通过实例。
classmethod 装饰器是将类本身作为第一个参数.
staticmethod 装饰器也会改变方法的调用方式, 它就是一个普通的函数,
classmethod 与 staticmethod 的区别就是 classmethod 会把类本身作为第一个参数传入, 其他都一样了.
看看例子:
>>> class Demo: ... @classmethod ... def klassmeth(*args): ... return args ... @staticmethod ... def statmeth(*args): ... return args ... >>> Demo.klassmeth() (<class '__main__.Demo'>,) >>> Demo.klassmeth('spam') (<class '__main__.Demo'>, 'spam') >>> Demo.statmeth() () >>> Demo.statmeth('spam') ('spam',)
三、私有属性和"受保护的"属性
在python中, 有一个简单的机制来处理私有属性:把使用一个下划线前缀标记的属性称为"受保护的"属性
只要知道私有属性的机制, 任何人都能直接读取和改写私有属性. 因此很多python程序员严格规定: 遵守使用一个下划线标记对象的私有属性 . Python 解释器不会对使用单个下划线的属性名做特殊处理, 由程序员自行控制。
不要使用双下划线:
class A: def __init__(self): self._x = 1 a = A() print(a._x) # AttributeError: 'A' object has no attribute '__x' print(a.__dict__)
报错说明:如果属性以 __name 的 两个下划线为前缀命名的实例属性, python会把它名称前面加一个下划线加类名, 再放入 __dict__ 中, 以 __name 为例, 就会变成 _A__name .
四、格式化输出
内置的 format() 函数和 str.format() 方法会调用相应的__format__(format_spec) 方法。
- format(my_obj, format_spec) 的第二个参数即格式说明符。
- str.format() 方法的格式字符串,替换字符串中{} 里的部分
1.使用"+"实现:
print "User:" + user_name + " has completed Action:" + action_name + " at Time:" + current_time
2.换用 % 来实现:
print "User:%s has completed Action:%s at Time:%s" % (user_name, action_name, current_time)
3.使用 str.format() 来实现:
print "User:{} has completed Action:{} at Time:{}".format(user_name, action_name, current_time)
使用位置索引
print "User:{0} has completed Action:{1} at Time:{2}".format(user_name, action_name, current_time)
使用关键字索引
print "Hello, {boy} and {girl}!".format(boy="John", girl="Mary")
注意:如果字符串本身含有花括号,则需要将其重复两次来转义,只需将它改写成 {{}} 即可。
还可以使用 *args 和 **kwargs 的形式传参。
还可以用来访问参数的属性或元素
print "My car is {0.color}.".format(black_car)
print "The first student is {student[0]}.".format(student=stu_list)
print "John is {d[john]} years old.".format(d=age_dict)
format_spec格式说明符
在替换字段中,格式说明符前面有一个冒号 : :
{字段名!转换字段:格式说明符}
其中格式说明符本身可以是一个字段名,比如:
print('{0:{1}}'.format(3.14159, '.4f')) #3.1416
标准格式说明符的格式:
[[fill]align][sign][#][0][width][grouping_option][.precision][type]
中文形式可以写作:
[[填充]对齐方式][正负号][#][0][宽度][分组选项][.精度][类型码]
1.填充:
只能是一个字符
不指定默认用空格填充
如果指定填充字符,则必须要同时指定对齐方式
2.对齐方式的取值:
<:左对齐
>:右对齐
^:居中
=:在正负号(如果有的话)和数字之间填充,该对齐选项仅对数字类型有效。
它可以输出类似 +0000120 这样的字符串。
注意:如果不给定最小宽度 width,对齐方式毫无意义。
3.正负号(选项仅对数字类型生效)
+ 正数前面添加正号,负数前面添加负号
- 仅在负数前面添加负号(默认行为)
空格:正数前面需要添加一个空格,以便与负数对齐
print('{:哈=+8.2f}'.format(-3.14159)) #-哈哈哈3.14
4.最小宽度 width
如果不指定,最小字段宽度由内容决定,与内容相等
如果最小宽度前面有一个前导 0,意味着用 0 填充
5.精度
精度指定了小数点后面要展示多少位小数
对于非数字类型,精度指定了最大字段宽度
整数类型不能指定精度
6.类型码
字符串类型(用s表示)
整数类型 (b 二进制;c 字符;d 十进制整数;o 八进制数;x 十六进制数a 到 f 小写;X 十六进制数,A 到 F 大写)
浮点数类型(e 科学记数法;f 定点记法默认精度为 6;% 百分号类型)