Python基础之六面向对象高级编程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014360817/article/details/54844748

'''
        面向对象高级编程
'''
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)

更多精彩内容访问个人站点www.gaocaishun.cn

猜你喜欢

转载自blog.csdn.net/u014360817/article/details/54844748
今日推荐