python高级面向对象

    #__slot__
    import traceback

    from types import MethodType

    class Myclass(object):
        __slots__ = ['name', 'set_name']

    def set_name(self, name):
        self.name = name
    
    cls = Myclass()
    cls.name = 'Tom'
    cls.set_name = MethodType(set_name, cls)
    cls.set_name = ('Jerry')
    print(cls.name)
    try:
        cls.age = 30
    except AttributeError:
        traceback.print_exc()

    class ExtMyclass(Myclass):
        pass
    ext_class = ExtMyclass()
    ext_cls.age = 30
    print(ext_cls.age)

    import traceback

    #propety
    class Student:
        @propety
        def score(self):
            return self._score

        @score.setter
        def score(self, value):
            if not isinstance(value, int):
                raise ValueError('not int')

            elif(value < 0) or (value > 100):
                raise ValueError('not between 0~100')

            self._score = value

    s = Student()
    s.score = 75
    print(s.score)
    try:
        s.score = 'abc'
    except ValueError:
        traceback.print_exc()
    try:
        s.score = 101
    except:
        traceback.print_exc()

    # 实现了__set__/__get__/__del__方法的类称为描述器

    class MyProperty:
        def __init__(self, fget = None, fset = None, fdel = None):
            self.fget = fget
            self.fset = fset
            self.fdel = fdel

        def __get__(self, instance, cls):
            if self.fget:
                self.fget(instance)
        
        def __set__(self, instance, value):
            if self.fset:
                self.fset(instance, value)

        def __del__(self,instance):
            if self.fdel:
                self.fdel(instance)
        
        def getter(self, fn):
            self.fget = fn
        
        def setter(self, fn):
            print('setter')
            self.fset = fn

        def deler(self, fn):
            self.fdel = fn

    class Student:
        @MyProperty
        def score(self):
            return self._score
        
        @score.setter
        def set_score(self, value):
            self._score = value
    
    s = Student()
    s.score = 95
    print(s.score)