
在Python中,定义类和调用类时,带()和不带()有重要区别。一定要区分好它们之间的差别
()和不带()()- 默认继承objectclass MyClass:
pass
# 等价于
class MyClass():
pass
# 也等价于
class MyClass(object):
pass
这三种写法在Python 3中是完全等价的,都继承自object类。
()- 继承指定父类class ChildClass(ParentClass):
pass
class Child1(Parent1, Parent2, Parent3):
pass
我们一般在开发过程中默认以下规则,以示区别:
()()()和不带()()- 引用类本身class MyClass:
def myname(self, name):
return name
if __name__ == '__main__':
per = MyClass # 将类本身赋值给 per,没有创建实例
print(per)
# print(per.myname("dafei")) # 这行被注释,如果取消注释会报错
输出结果:
<class '__main__.MyClass'>
per = MyClass:per 被赋值为类 MyClass 本身,而不是类的实例。print(per)print(per) 输出的是类的表示形式,即 <class '__main__.MyClass'>(表示这是一个定义在 __main__ 模块中的类)print(per.myname("dafei"))TypeError),因为 per.myname 是一个实例方法,需要类的实例作为第一个参数(self)。但这里 per 是类本身,调用 per.myname("dafei") 相当于直接调用类方法,但没有提供 self 参数,因此会失败() - 实例化类class MyClass:
def myname(self, name):
return name
if __name__ == '__main__':
per = MyClass() # 创建 MyClass 的一个实例
print(per)
print(per.myname("dafei"))
输出结果:
<__main__.MyClass object at 0x102c4bfd0>
dafei
per = MyClass()() 创建了 MyClass 的一个实例(对象),并赋值给 per。因此 per 现在是一个实例对象print(per)<__main__.MyClass object at 0x102c4bfd0>(这表示MyClass 的实例对象,位于内存地址 0x102c4bfd0)print(per.myname("dafei"))myname,并传递参数 "dafei"。方法返回 "dafei",因此打印出 dafei。这里 self 参数自动绑定到实例 per,所以可以调用成功小伙伴们可以收藏这篇文章,在定义类和调用类时记得查看一下,不要在debug时,才后悔莫及喔~