理想的类结构

@Property
装饰器
class Square1:
def __init__(self):
self.__side = None
def get_side(self):
return self.__side
def set_side(self, side):
assert side >= 0, '边长不能为负数!'
self.__side = side
def del_side(self):
self.__side = 0
class Square2:
def __init__(self):
self.__side = None
@property
def side(self):
return self.__side
@side.setter
def side(self, side):
assert side >= 0, '边长不能为负数!'
self.__side = side
@side.deleter
def side(self):
self.__side = 0
s = Square2()
s.side = 10
print(s.side)
del s.side
print(s.side)
公有化与私有化
class Person:
def __init__(self, name: str, age: int):
self._name = name
self.__age = age
@property
def name(self):
return self._name
@name.setter
def name(self, name):
self._name = name
@property
def age(self):
return self.__age
@age.setter
def age(self, name):
self.__age = name
class Teacher(Person):
@property
def info(self):
return self._name, self.__age
t = Teacher('Jack', 35)
print(t.info)
属性控制
class Person:
def __getattribute__(self, item):
print(f'getting attribute [{
item}]')
return super().__getattribute__(item)
def __setattr__(self, key, value):
print(f'setting attribute [{
key}] to [{
value}]')
super().__setattr__(key, value)
person = Person()
person.name = 'Jack'
print(person.name)
"""
运行结果:
setting attribute [name] to [Jack]
getting attribute [name]
Jack
"""
MRO

"""
MRO: Method Resolution Order(方法解析顺序)
作用:用于类的继承树的方法搜索顺序
在单继承的情况下,我们可以很好的理解"类的继承树的方法顺序"
但是在多继承下,"类的继承树的方法顺序"就显得尤为复杂了(在 Python3 里面,使用了C3线性化的算法进行排序)
通常情况下,我们可以使用类的 mro() 方法来直接查看"类的继承树的方法顺序"
"""
class A(object):
pass
class B(object):
pass
class C(object):
pass
class D(object):
pass
class E(object):
pass
class K1(C, A, B):
pass
class K2(A, D):
pass
class K3(B, D, E):
pass
class Z(K1, K2, K3):
pass
print(Z.mro())
可迭代对象
print('\n-----------------------------')
lst = [66, 77, 88]
for num in lst:
print(num, end=' ')
print('\n-----------------------------')
iter_obj = lst.__iter__()
print(iter_obj.__next__(), end=' ')
print(iter_obj.__next__(), end=' ')
print(iter_obj.__next__(), end=' ')
print('\n-----------------------------')
class Fibonacci:
"""
F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 (n >= 2)
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, ...
"""
def __init__(self, n):
self.__n = n
self.__previous = 0
self.__current = 1
self.__count = 0
def __iter__(self):
return self
def __next__(self):
if self.__count >= self.__n:
raise StopIteration
self.__count += 1
return_value = self.__previous
self.__previous, self.__current = self.__current, self.__previous + self.__current
return return_value
for num in Fibonacci(12):
print(num, end=' ')
print('\n-----------------------------')
"""
运行结果:
-----------------------------
66 77 88
-----------------------------
66 77 88
-----------------------------
0 1 1 2 3 5 8 13 21 34 55 89
-----------------------------
"""
__getitem__()
方法
"""
在创建一个可迭代的对象序列时,可以用__iter__()和__next__()方法
如果没有这两个方法,我们还可以通过__getitem__()方法和__len__()方法进行创建序列
如果__getitem__()方法和__len__()方法也没有的话,解释器会抛出 TypeError 的错误!
而__getitem__()方法与上面的__iter__()方法正好相反
它是以空间换取时间:
1.先占用内存,布置好数据
2.随机查找的时