起初似乎有可能,但我想知道这是否可能在没有任何外部干扰的情况下实现。 例如:
$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);
这可能吗?如果是这样,它在结构上会如何运作?这甚至有用吗?
答案 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,), {})
答案 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()
语法是相同的,如果工厂上的唯一操作是实例化,则没有区别。