python学习20之面向对象编程高级

''''''
'''
1.动态绑定:对于一个类,我们可以对它的实例动态绑定新的属性或方法。
为了使所有的实例均可以使用动态绑定的属性和方法,我们也可以采用对类直接动态绑定
'''
class Student():
pass

s1=Student()
s1.age=18 #对于实例动态绑定属性
print(s1.age)

def set_age(self,age):
self.age=age

s2=Student()
s2.set_age=set_age(s2,18) #对于实例动态绑定方法
print(s2.age)

Student.set_age=set_age #对于类直接动态绑定一个方法
s3=Student()
s3.set_age(20)
print(s3.age)
'''
2._slot_变量 :
限制实例可以动态绑定的属性
对于父类的_slot_变量,对子类不起作用
'''
class Teacher():
__slots__ = ('name','age') #用元组的方式进行限制

t1=Teacher()
t1.name="Mr. Wang"
t1.age="22"
# t1.salary="2000" #AttributeError: 'Teacher' object has no attribute 'salary'
print(t1.name+":"+t1.age)

'''
3.@property
装饰器
'''
class Stu():
@property
def score(self):
return self._score
@score.setter
def score(self,value):
self._score=value

s4=Stu()
s4.score=50
print(s4.score)
'''
4.多重继承:一个子类可以同时继承多个父类
结构: class 子类名(父类名1,父类名2,...)
5.__iter__:返回迭代对象
如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,
然后,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环
见斐波那契数列
'''

# class Fib(object):
# def __init__(self):
# self.a, self.b = 0, 1 # 初始化两个计数器a,b
#
# def __iter__(self):
# return self # 实例本身就是迭代对象,故返回自己
#
# def __next__(self):
# self.a, self.b = self.b, self.a + self.b # 计算下一个值
# if self.a > 100000: # 退出循环的条件
# raise StopIteration()
# return self.a #返回下一个值
# for n in Fib():
# print(n)
'''
要表现得像list那样按照下标取出元素,需要实现__getitem__()方法:
'''
class Fib(object):
def __getitem__(self, n):
a, b = 1, 1
for x in range(n):
a, b = b, a + b
return a
f=Fib()
print(f[2])
'''
6.__str__():我们用这个方法可以将用print方法打印出来的东西按照我们的想法输出
'''
class Student1(object):
def __init__(self, name):
self.name = name
def __str__(self):
return "name:"+self.name
...
print(Student1('Tom'))
'''
7.__repr__():
'''
s=Student1("Alan")
'''
不用print函数时,s本身的状态就是<__main__.Student object at 0x109afb310>,
这是因为直接显示变量调用的不是__str__(),而是__repr__(),
两者的区别是__str__()返回用户看到的字符串,而__repr__()返回程序开发者看到的字符串,也就是说,__repr__()是为调试服务的。
解决办法是再定义一个__repr__()。但是通常__str__()和__repr__()代码都是一样的,所以,有个偷懒的写法:
'''
class Student2(object):
def __init__(self, name):
self.name = name
def __str__(self):
return 'Student object (name=%s)' % self.name

__repr__ = __str__
'''
8.枚举类:Enum类
'''
from enum import Enum

Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
'''
这样我们就获得了Month类型的枚举类,可以直接使用Month.Jan来引用一个常量,或者枚举它的所有成员:
'''
for name, member in Month.__members__.items():
print(name, '=>', member, ',', member.value)
'''
value属性则是自动赋给成员的int常量,默认从1开始计数。
'''