Python面向对象高级编程

__slots__:在定义class的时,定义一个特殊的__slots__变量,来限制该class实例能添加的属性
class Student(object):
    __slots__ = ("name","age")
s = Student()
s.name = "fred"
s.city = "chengdu"  #'Student' object has no attribute 'city'

class Stu(Student):
    pass
stu = Stu()
stu.city = "chengdu"    #__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
                        #除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__
@property装饰器:负责把一个方法变成属性调用
class Student(object):
    @property   #表明接下来的birth只是一个属性
    def birth(self):
        return self._birth

    @birth.setter
    def birth(self,value):
        self._birth = value
    
    @property  #表明接下来的age只是一个属性
    def age(self):
        return 2015 - self._birth
s = Student()
s.birth = 2000
print(s.age)    #15
多重继承:一个子类可以获得多个父类的所有功能
class Dog(Mammal, RunnableMixIn, CarnivorousMixIn):
    pass
定制类
__str__:返回打印类时的字符串
__repr__:返回直接查看类时的字符串
__iter__:__iter__()方法,返回一个迭代对象,然后不断调用__next()__方法拿到下一个值
__next__
__getitem__:实现像list那样的功能
__getattr__:__getattr__()方法,动态返回一个属性
__call__:__call__()方法,直接对实例进行调用
class Student(object):
    def __init__(self,name):
        self.name = name
    def __str__(self):
        return "Student object (name %s)" % self.name
    __repr__ = __str__
枚举类
from enum import Enum
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
for name, member in Month.__members__.items():  #value默认从1开始
    print(name, '=>', member, ',', member.value)    #Jan => Month.Jan , 1 ... Dec => Month.Dec , 12
元类
  • type()

    用type()创建一个class对象,依次传入3个参数:

    1. class的名称;
    2. 继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
    3. class的方法名称与函数绑定,这里我们把函数fn绑定到方法名hello上。
Hello = type('Hello', (object,), dict(hello=fn)) # 创建Hello class
  • metaclass:可以把类看成是metaclass创建出来的“实例”
 
 
 
 
 
 
 
posted @ 2017-12-21 16:41  枫叶布  阅读(192)  评论(0编辑  收藏  举报