欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python高级编程 读书笔记: 11、第六章_类工厂

程序员文章站 2024-02-09 18:13:58
...
#!/usr/bin/env python
# encoding: utf-8

import six

'''
11、第六章_类工厂

关键:
1 类工厂
含义: 在运行时创建类(注意不是类的实例)的函数,允许创建类时根据情况决定其属性
特点:
1)类本身也是一个对象,它的类是type
2)使用class关键字而不是直接调用type创建类更加可行

2 决定何时应该编写类工厂
原因: 需要基于运行时的信息(如用户输入)创建类时
使用方式: 在函数中根据输入参数的不同,初始化不同的属性,并返回该类(
        注意不是返回类的实例)

3 类方法
含义: 不需要类的实例就可以执行的方法,但需要类本身。
特点: 通常使用@classmethod装饰器来装饰一个方法来完成声明。
        该方法的第一个参数是cls。

4 单例模式
含义: 只允许一个实例的类模式


参考:
Python高级编程

'''

def createAnimalClass():
    def init(self, name):
        self.name = name

    def eat(self):
        pass

    def goToVet(self):
        pass

    return type('Animal', (object,), {
        '__init__': init,
        'eat': eat,
        'goToVet': goToVet,
    })


def validCreateAnimalClass():
    Animal1 = createAnimalClass()
    Animal2 = createAnimalClass()
    print Animal1 == Animal2


def getCredentialClass(useProxy=False, twoFactorAuth=False):
    if useProxy:
        keys = ['email', 'serviceName']
    else:
        keys = ['username', 'password']
        if twoFactorAuth:
            keys.append('twoFactorAuth')

    class Auth(object):
        expectedKeys = set(keys)

        def __init__(self, **kwargs):
            if set(kwargs.keys()) != self.expectedKeys:
                raise ValueError('Keys are incorrect.')
            for key, value in kwargs.iteritems():
                setattr(self, key, value)

    return Auth


class ClassC(object):
    foo = 'bar'

    @classmethod
    def classFoo(cls):
        return cls.foo


def createSubClass(newFoo):
    class SubC(ClassC):
        foo = newFoo

    return SubC


def useClassMethod():
    c1 = ClassC()
    print c1.foo
    print c1.classFoo()
    subClass = createSubClass('chao')
    print subClass.classFoo()


def process():
    validCreateAnimalClass()
    useClassMethod()


if __name__ == "__main__":
    process()