Python中的类可以分为两种形式:新式类和经典类。本文将从多个角度对这两者进行比较,并介绍它们的区别。
一、新式类与经典类的定义
1、经典类:
class MyClass:
pass
2、新式类:
class MyClass(object):
pass
在Python 3中,所有的类都是新式类。而在Python 2中,如果类没有显式地继承自object,则为经典类。
二、新式类与经典类的多继承
1、经典类多继承:
class Parent1:
def hello(self):
print("Parent1 says hello")
class Parent2:
def hello(self):
print("Parent2 says hello")
class Child(Parent1, Parent2):
pass
c = Child()
c.hello() # Output: Parent1 says hello
2、新式类多继承:
class Parent1(object):
def hello(self):
print("Parent1 says hello")
class Parent2(object):
def hello(self):
print("Parent2 says hello")
class Child(Parent1, Parent2):
pass
c = Child()
c.hello() # Output: Parent1 says hello
在新式类中,多继承的顺序是按照继承列表的顺序从左到右进行的。而在经典类中,继承的顺序是深度优先的。
三、新式类与经典类的属性查找顺序
1、经典类属性查找顺序:
在经典类中,属性查找是按照深度优先的顺序进行的。即先查找当前类,再查找父类,直到找到属性或者到达顶层对象object。
class Parent:
x = 1
class Child1(Parent):
pass
class Child2(Parent):
pass
class GrandChild(Child1, Child2):
pass
print(GrandChild.x) # Output: 1
2、新式类属性查找顺序:
在新式类中,属性查找是按照广度优先的顺序进行的。即先查找当前类,再按照继承列表的顺序从左到右查找父类,直到找到属性或者到达顶层对象object。
class Parent(object):
x = 1
class Child1(Parent):
pass
class Child2(Parent):
pass
class GrandChild(Child1, Child2):
pass
print(GrandChild.x) # Output: 1
四、新式类与经典类的super()函数
1、经典类super()函数:
class Parent:
def __init__(self):
self.x = 1
class Child(Parent):
def __init__(self):
super(Child, self).__init__()
c = Child()
print(c.x) # Output: 1
2、新式类super()函数:
class Parent(object):
def __init__(self):
self.x = 1
class Child(Parent):
def __init__(self):
super().__init__()
c = Child()
print(c.x) # Output: 1
在新式类中,可以使用super()函数简化父类的调用,而在经典类中则无法使用super()函数。
五、新式类与经典类的静态方法与类方法
1、经典类静态方法与类方法:
class MyClass:
@staticmethod
def static_method():
print("Static method")
@classmethod
def class_method(cls):
print("Class method")
MyClass.static_method() # Output: Static method
MyClass.class_method() # Output: Class method
2、新式类静态方法与类方法:
class MyClass(object):
@staticmethod
def static_method():
print("Static method")
@classmethod
def class_method(cls):
print("Class method")
MyClass.static_method() # Output: Static method
MyClass.class_method() # Output: Class method
在新式类和经典类中,静态方法和类方法的使用方式没有区别。
六、新式类与经典类的metaclass
1、经典类metaclass:
class MetaClass(type):
def __new__(mcs, name, bases, attrs):
return super(MetaClass, mcs).__new__(mcs, name, bases, attrs)
class MyClass:
__metaclass__ = MetaClass
print(type(MyClass)) # Output: <class '__main__.MetaClass'>
2、新式类metaclass:
class MetaClass(type):
def __new__(mcs, name, bases, attrs):
return super().__new__(mcs, name, bases, attrs)
class MyClass(object, metaclass=MetaClass):
pass
print(type(MyClass)) # Output: <class '__main__.MetaClass'>
在新式类和经典类中,都可以使用metaclass来自定义类的创建。但是在Python 3中,使用metaclass的方式发生了变化。
七、新式类与经典类的对象创建方式
1、经典类对象创建方式:
class MyClass:
pass
obj = MyClass()
2、新式类对象创建方式:
class MyClass(object):
pass
obj = MyClass()
新式类和经典类的对象创建方式基本相同,只是在类定义时是否显式地继承自object的区别。
八、总结
本文从类定义、多继承、属性查找顺序、super()函数、静态方法与类方法、metaclass和对象创建方式等多个方面对Python新式类与经典类进行了详细的比较和阐述。了解这些区别对于编写Python代码和理解类的机制有着重要的意义。
本文链接:https://my.lmcjl.com/post/9428.html
4 评论