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