Python:类实例是类

时间:2015-05-09 20:09:45

标签: python class python-3.x

是否可以创建一个实例为类的类?

起初似乎有可能,但我想知道这是否可能在没有任何外部干扰的情况下实现。 例如:

$url = 'https://facebook.com/5';
$ssl = true;
$ch = curl_init();
$timeout = 3;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $ssl);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$data = curl_exec($ch);
curl_close($ch);

这可能吗?如果是这样,它在结构上会如何运作?这甚至有用吗?

4 个答案:

答案 0 :(得分:6)

如果您检查1的类型type(1) == int。如果您检查int的类型type(int) == type

其实例为类的类称为元类,在Python中,您通过子类化type创建元类。

class ClassClass(type):
    pass

技术上collections.namedtuple是一个元类,但它实际上是cheating

有一个很棒的PyCon talk by David Beazly about metaprogramming in Python。这很长,但非常有趣。他在27分钟左右开始谈论元类。

答案 1 :(得分:3)

您正在寻找元类:

class Foo(type):
    # Foo is a subclass of type and just like instances of type are
    # classes, instances of Foo are classes.
    pass

class Bar(object):
    # The Bar class is an instance of Foo
    __metaclass__ = Foo

# You can also create instances of Foo dynamically.
Bar = Foo("Bar", (object,), {})

More on metaclasses.

答案 2 :(得分:2)

来自Python帮助:

type(name, bases, dict) -> a new type

所以让我们创建一个简单的类:

Dog = type('Dog', (object,), {})

现在你可以创造一只狗了:

fido = Dog()

如果你真的想要一个创建类的类,你可以通过扩展类型来实现...老实说,我不知道你想要它,但它在这里:

class ClassMaker(type):
    def __new__(self, name):
        return type(name, (object,), {})

NewClass = ClassMaker('NewClass')
print NewClass

答案 3 :(得分:0)

在(现代)python中,类是一阶对象。通过访问类“__class__属性

,可以轻松验证这一点
class A:
    pass

print(A.__class__)
-> <class 'type'>

请注意,type的课程也是type

print(type.__class__)
-> <class 'type'>

实际上可以从type

派生
class A:
    def do(self):
       print("DOING")


class mytype(type):
    def __new__(cls, *args, **kwargs):
        return type.__new__(cls, 'mytype', cls.__bases__, {})

    def __init__(self):
        return type.__init__(self, 'mytype', self.__class__.__bases__, {})

    def __call__(self, *args, **kwargs):
        return A(*args, **kwargs)

aClass = mytype()
-> <class '__main__.mytype'>
aObj = aClass()
print(aObj)
-> <__main__.A object at 0xdeadbeaf>
aObj.do()
-> DOING

然而,正确的metaclasses我没有看到跳过这种篮球的好理由。即使是元类也只在特殊情况下才需要。通常,返回类对象的工厂方法就足够了:

def ClassClass():
    return A

aClass = ClassClass()
aObj = aClass()

语法是相同的,如果工厂上的唯一操作是实例化,则没有区别。