Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python元类与常规类继承有何不同?_Python_Metaclass - Fatal编程技术网

Python元类与常规类继承有何不同?

Python元类与常规类继承有何不同?,python,metaclass,Python,Metaclass,这可能是一个太多的开放式问题,但我刚刚在学习Python中的元类,我不明白元类与让子类从父类继承有什么不同,比如 class child(parent): 这难道不能达到元类的相同目的吗?我想可能我不理解元类的用途。区别在于从类继承不会影响类的创建方式,它只影响类实例的创建方式。如果您这样做: class A(object): # stuff class B(A): # stuff 那么,在创建B时,A没有任何机会“钩住”。在创建B的实例时可以调用A的方法,但在创建类B本身

这可能是一个太多的开放式问题,但我刚刚在学习Python中的元类,我不明白元类与让子类从父类继承有什么不同,比如

class child(parent):

这难道不能达到元类的相同目的吗?我想可能我不理解元类的用途。

区别在于从类继承不会影响类的创建方式,它只影响类实例的创建方式。如果您这样做:

class A(object):
    # stuff

class B(A):
    # stuff
那么,在创建B时,A没有任何机会“钩住”。在创建B的实例时可以调用A的方法,但在创建类B本身时不能调用


元类允许您在创建类时定义自定义行为。有关元类如何工作的示例,请参考我标记为“重复”的问题,并说服自己,在这些示例中存在使用正常继承无法实现的效果。

这是一个重复的问题吗?我不是问“什么是元类”,我已经读了好几遍了。我特别问的是,元类和继承自父类的子类之间有什么区别,正如我在问题中所说的。你所问的是该问题中所问问题的子集,如果你阅读并理解了该问题的答案,你会明白你所问的区别。试着在youtube上查找视频教程,这可能会更有帮助。@BrenBarn,这是最好的一行回答。谢谢
class AccessorType(type):
    def __init__(self, name, bases, d):
        type.__init__(self, name, bases, d)
        accessors = {}
        prefixs = ["get_", "set_", "del_"]

        for k in d.keys():
            v = getattr(self, k)
            for i in range(3):
                if k.startswith(prefixs[i]):
                    accessors.setdefault(k[4:], [None, None, None])[i] = v

        for name, (getter, setter, deler) in accessors.items():
            # create default behaviours for the property - if we leave
            # the getter as None we won't be able to getattr, etc..
            # [...] some code that implements the above comment
            setattr(self, name, property(getter, setter, deler, ""))