040类和对象:一些相关的BIF(下)
本帖最后由 摆渡终极鉴黄师 于 2017-10-1 11:18 编辑getattr(object, name[, default])#用于返回对象的属性值,如果指定的对象不存在,如果有设置default,那么Ta会把default参数打印,否则会抛出异常,返回一个AttributeError
其他知识
本帖最后由 摆渡终极鉴黄师 于 2017-9-29 21:31 编辑严记只要是用户可以控制的变量都是有危害的 本帖最后由 摆渡终极鉴黄师 于 2017-10-1 11:21 编辑
1、如果第一个参数不是对象,则永远返回False
2、如果第二个参数不是类或者由类的对象组成的元祖,会抛出一个TypeError异常
isinstance(object, classinfo)
041魔法方法:构造和析构(上)
本帖最后由 摆渡终极鉴黄师 于 2017-10-4 18:06 编辑魔法方法总是被双下划线包围,例如__init__
魔法方法是面向对象的python的一切
魔法方法的“魔力”体现在总是能够在适当的时候自动被调用
041魔法方法:构造和析构(中)
本帖最后由 摆渡终极鉴黄师 于 2017-10-4 18:06 编辑___new___(cls[, ...])例如
>>>class CapStr(str):
def __new__(cls, string):
string = string.upper()
return str.__new__(cls, string)
>>>a = CapStr("I love FishC.com!")
>>>a
'I LOVE FISHC.COM!'
>>>
041魔法方法:构造和析构(下)
本帖最后由 摆渡终极鉴黄师 于 2017-10-4 18:07 编辑>>> class C:
def __init__(self):
print("我是__init__方法,我被调用了....")
def __del__(self):
print("我是__del__方法,我被调用了....")
>>> c1 = C()
我是__init__方法,我被调用了....
>>> c2 = c1
>>> c3 = c2
>>> del c3
>>> del c2
>>> del c1
我是__del__方法,我被调用了....
>>>
魔法del方法Ta并不是说发生del操作后就被调用,当Ta的对象生成之后,所有对Ta的引用,都被del之后,才会启动垃圾回收机制,当这个垃圾回收机制去销毁这个对象的时候,Ta就会自动调用del方法
042魔法方法:算术运算(上)
本帖最后由 摆渡终极鉴黄师 于 2017-10-5 18:27 编辑__add__(self, other) 定义加法的行为:+
__sub__(self, other) 定义减法的行为:-
__mul__(self, other) 定义乘法的行为:*
__truediv__(self, other) 定义真除法的行为:/
__floordiv__(self, other) 定义整数除法的行为://
__mod__(self, other) 定义取模算法的行为:%
__divmod__(self, other) 定义当被 divmod() 调用时的行为
__pow__(self, other[, modulo]) 定义当被 power() 调用或 ** 运算时的行为
__lshift__(self, other) 定义按位左移位的行为:<<
__rshift__(self, other) 定义按位右移位的行为:>>
__and__(self, other) 定义按位与操作的行为:&
__xor__(self, other) 定义按位异或操作的行为:^
__or__(self, other) 定义按位或操作的行为:|
042魔法方法:算术运算(中)
本帖最后由 摆渡终极鉴黄师 于 2017-10-7 07:06 编辑>>> class New_int(int):
def __add__(self, other):
return int.__sub__(self, other)
def __sub__(self, other):
return int.__add__(self, other)
>>> a = New_int(3)
>>> b = New_int(5)
>>> a + b # 调用了add魔法方法
-2
>>> a - b # 调用了sub魔法方法
8
042魔法方法:算术运算(中2)
本帖最后由 摆渡终极鉴黄师 于 2017-10-7 18:42 编辑>>> class Try_int(int):
def __add__(self, other):
return self + other
def __sub__(self, other)
return self - other
>>> a = Try_int(3)
>>> b = Try_int(5)
>>> a + b # 先调用add,返回self(self绑定了a进来),other事实上呢是加法右边的另外一个数,也就是b,return又是返回 a+b,又是发现加法,然后又是进行add,先调用add,返回self(self绑定了a进来),other事实上...所以就无限递归了
>>> *!^*(&$@*&!#(* # 无限递归
042魔法方法:算术运算(下)
本帖最后由 摆渡终极鉴黄师 于 2017-10-9 02:27 编辑>>> class Try_int(int):
def __add__(self, other):
return int(self) + int(other) # 这样的话呢返回的就是一个整形相加的值了
def __sub__(self, other):
return int(self) - int(other) # 这样的话呢返回的就是一个整形相减的值了
>>> a = Try_int(3)
>>> b = Try_int(5)
>>> a + b
8
>>>
然后就不会无限递归了 本帖最后由 摆渡终极鉴黄师 于 2017-10-10 18:03 编辑
divmod(a, b)返回的值是一个元祖:(a//b, a%b)
043魔法方法:算术运算2(上)
本帖最后由 摆渡终极鉴黄师 于 2017-10-12 19:08 编辑>>> class int(int):
def __add__(self, other)
return int.__sub__(self, other)
>>> a = int('5')
>>> a
5
>>> b = int(3)
>>> a + b
2 # 这里是因为add方法被sub覆盖掉了(a的话呢,加法操作没有实现或者不支持的时候,Ta就会实现b的反运算,相应的加法反运算操作符)
>>>
当Ta变成类对象的时候Ta就把原来的给覆盖掉了
043魔法方法:算术运算2(中)
本帖最后由 摆渡终极鉴黄师 于 2017-10-12 19:17 编辑>>> class Nint(int):
def __radd__(self, other):
return int.__sub__(self, other) # 这里的self指的是b,这里的other反而是指前面的那一个
>>> a = Nint(5)
>>> b = Nint(3)
>>> a + b
8
>>> 1 + b # 因为这个1Ta找不到Ta的add方法然后Ta就找了b,b呢有这个radd方法,那么Ta就触发b的radd方法,结果上呢事实上就执行了一个sub方法,把两个相减,把3去减去1就得到这个2
2
>>>
043魔法方法:算术运算2(中2)
本帖最后由 摆渡终极鉴黄师 于 2017-10-14 16:33 编辑>>> class Nint(int):
def __rsub__(self, other):
return int.__sub__(self, other) #←
>>> a = Nint(5)
>>> 3 - a
2
所以应该这样
>>> class Nint(int):
def __rsub__(self, other):
return int.__sub__(other, self)#←
>>> a = Nint(5)
>>> 3 - a
2
043魔法方法:算术运算2(下)
本帖最后由 摆渡终极鉴黄师 于 2017-10-14 16:39 编辑一元操作符
__neg__(self) 定义正号的行为:+x #强调说你这玩意儿是一个正数,表示正号的行为
__pos__(self) 定义负号的行为:-x #强调说你这玩意儿是一个负数,表示负号的行为
__abs__(self) 定义当被abs()调用时的行为 #取绝对值的意思
__invert__(self)定义按位取反的行为:~x #0的变成1,1的变成0
044魔法方法:简单定制(上)
本帖最后由 摆渡终极鉴黄师 于 2017-10-16 13:27 编辑时间远足(time.struct_time):
gmtime(), localtime()和strptime()以时间元祖(struct_time)的形势返回。
索引值(Index) 属性(Attribute) 值(Values)
0 tm_year(年) (例如:2015)
1 tm_mon(月) 1 ~ 12
2 tm_mday(日) 0 ~ 31
3 tm_hour(时) 0 ~ 23
4 tm_min(分) 0 ~ 59
5 tm_sec(秒) 0 ~ 61(下方见注1)
6 tm_wday(星期几) 0 ~ 6(0 表示星期一)
7 tm_yday(一年中的几天) 1 ~ 366
8 tm_isdst(是否为夏令时) 0, 1, -1(-1代表夏令时)
注1:范围真的是 0 ~ 61;60代表闰秒, 61是基于历史原因保留。
044魔法方法:简单定制(下)
本帖最后由 摆渡终极鉴黄师 于 2017-10-17 20:29 编辑import time as t
class MyTimer:
def __init__(self):
self.unit = ['年', '月', '天', '小时', '分钟', '秒']
self.prompt = "未开始计时!"
self.lasted = []
self.begin = 0 # 不要跟方法名重复
self.end = 0
def __str__(self):
return self.prompt
__repr__ = __str__
def __add__(self, other):
prompt = "总共运行了"
result = []
for index in range(6):
result.append(self.lasted + other.lasted)
if result:
prompt += (str(result) + self.unit)
return prompt
# 开始计时
def start(self):
self.begin = t.localtime()
self.prompt = "提示:请先调用 stop() 停止计时!"
print("计时开始...")
# 停止计时
def stop(self):
if not self.begin:
print("提示:请先调用 start() 进行计时!")
else:
self.end = t.localtime()
self._calc()
print("计时结束!")
# 内部方法,计算运行时间
def _calc(self):
self.lasted = []
self.prompt = "总共运行了"
for index in range(6):
self.lasted.append(self.end - self.begin)
if self.lasted:
self.prompt += (str(self.lasted) + self.unit)
# 为下一轮计时初始化变量
self.begin = 0
self.end = 0
045魔法方法:属性访问(上)
本帖最后由 摆渡终极鉴黄师 于 2017-10-17 20:28 编辑属性函数property
将类方法转换为只读属性
重新实现一个属性的setter和getter方法 本帖最后由 摆渡终极鉴黄师 于 2017-10-18 18:18 编辑
魔法方法 什么时候被调用 解释
__new__(cls [,...]) instance = MyClass(arg1, arg2) __new__在实例创建时调用
__init__(self [,...]) instance = MyClass(arg1,arg2) __init__在实例创建时调用
__cmp__(self) self == other, self > other 等 进行比较时调用
__pos__(self) +self 一元加法符号
__neg__(self) -self 一元减法符号
__invert__(self) ~self 按位取反
__index__(self) x 当对象用于索引时
__nonzero__(self) bool(self) 对象的布尔值
__getattr__(self, name) self.name #name不存在 访问不存在的属性
__setattr__(self, name) self.name = val 给属性赋值
__delattr_(self, name) del self.name 删除属性
__getattribute__(self,name) self.name 访问任意属性
__getitem__(self, key) self 使用索引访问某个元素
__setitem__(self, key) self = val 使用索引给某个元素赋值
__delitem__(self, key) del self 使用索引删除某个对象
__iter__(self) for x in self 迭代
__contains__(self, value) value in self, value not in self 使用in进行成员测试
__call__(self [,...]) self(args) “调用”一个实例
__enter__(self) with self as x: with声明的上下文管理器
__exit__(self, exc, val, trace) with self as x: with声明的上下文管理器
__getstate__(self) pickle.dump(pkl_file, self) Pickling
__setstate__(self) data = pickle.load(pkl_file) Pickling#拷贝用来复习的{:10_257:}
045魔法方法:属性访问(中)
本帖最后由 摆渡终极鉴黄师 于 2017-10-19 21:38 编辑class C:
def __getattribute__(self, name):
print('getattribute')
# 使用 super() 调用 object 基类的 __getattribute__ 方法
return super().__getattribute__(name)
def __setattr__(self, name, value):
print('setattr')
super().__setattr__(name, value)
def __delattr__(self, name):
print('delattr')
super().__delattr__(name)
def __getattr__(self, name):
print('getattr')