'''
面向对象高级编程
'''
from enum import Enum
'''
__slots__
限制实例属性
定义的属性只对当前类实例起作用,对于继承的子类不起作用
'''
class Student(object):
__slots__ = ('name', 'age')
s = Student()#创建一个新的实例
s.name = '张三'#绑定属性
s.age = 45
#s.score = 99,在__slots__中没有score则不不能绑定
print(s.name)
'''
@propert
'''
class Student(object):
@property
def score(self):
return self._score
@score.setter
def score(self, value):
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 200:
raise ValueError('score must between 0 ~ 200')
self._score = value
s = Student()
s.score = 60#实际转化为s.set_score(60)
print(s.score)#实例转化为s.get_score()
'''
多重继承
Python允许使用多重继承
'''
'''
定制类
__str__
'''
'''
__str__
__repr__ 同上
__iter__
'''
class Student(object):
def __init__(self, name):
self.name = name
print(Student('张三'))##默认打印方式
class Student(object):
def __init__(self, name):
self.name = name
def __str__(self):
return 'Student object (name: %s)' % self.name
__pepr__ = __str__
print(Student('张三'))##复写__str__方法打印方式
'''
__iter__
类似于想被for...in循环,必须实现一个__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#返回下一个值
def __getitem__(self, item):#想像list中一样取出下标 必须实现__getitem__()方法
a, b = 1, 1
for x in range(item):
a, b = b, a + b
return a
for n in Fib():
print(n)
'''
__getitem__
想像list中一样取出下标 必须实现__getitem__()方法
'''
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#返回下一个值
def __getitem__(self, item):#想像list中一样取出下标 必须实现__getitem__()方法
a, b = 1, 1
for x in range(item):
a, b = b, a + b
return a
f = Fib()
print(f[9])
'''
__getattr__
正常情况下,当我们调用类的方法或属性时,如果不存在,就会报错。
'''
class Student(object):
def __init__(self):
self.naame = "张三"
def __getattr__(self, item):#不存在时会返回99
if item == 'score':
return 99
s = Student()
print(s.name)
print(s.score)
'''
__call__
实例本身调用属性和方法
'''
class Student(object):
def __init__(self, name):
self.name = name
def __call__(self):
print('My name is %s.' % self.name)
s = Student("张三")
print(s())
'''
使用枚举类
'''
from enum import Enum
Month = Enum('Moth', ('Jan', 'Fen', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
for name, member in Month.__members__.items():
print(name, '=>', member, ',', member.value)
print(Month.Mar.value)
from enum import Enum, unique
@unique
class Weekday(Enum):
Sun = 0#Sun的value被设定为0
Mon = 1
Tue = 2
Web = 3
Thu = 4
Fri = 5
Sat = 6
print(Weekday.Mon)
print(Weekday.Thu)
print(Weekday['Tue'])
print(Weekday(5))
'''
使用元类
'''
'''
type
动态语言和静态语言的最大不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的
'''
class Hello(object):
def hello(self, name = 'world'):
print('Hello, %s.' % name)
h = Hello()
print(h.hello())
print(type(Hello))
print(type(h))
def fn(self, name = 'world'):#先定义函数
print('Hello, %s.' % name)
#创建一个class对象, type()函数一次传入3个参数
#1class名称
#2继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元写法,后面跟个','号
#3class的方法名称与函数绑定,这里我们把函数fn绑定到方法名为hello上.
Hello = type('Hello', (object,), dict(hello=fn))
h = Hello()
print(h.hello())
'''
metaclass
'''
class ListMetaclass(type):
#接收参数
#1当前准备创建的类的对象
#2类的名字
#3累积继承的集合
#4类的方法集合
def __new__(cls, name, bases, attrs):
attrs['add'] = lambda self, value: self.append(value)
return type.__new__(cls, name, bases, attrs)
class MyList(list, metaclass=ListMetaclass):
pass
L = MyList()
L.add(1)
print(L)
Python基础之六面向对象高级编程
最新推荐文章于 2024-08-26 18:56:03 发布