Python创建类的时候,加()和不加有什么区别、联系?

在Python中定义类class的时候,可以加上():

class Employee():
    """这里是Employee的__doc__"""
    empCount = 0
    __name1 = 'safety'
    def __init__(self,name,salary):
        self.name = name
        self.salary = salary
        Employee.empCount += 1
    
    def display_count(self):
        print('Totall employee count:{}'.format(Employee.empCount))
    
    def display_employee(self):
        print('Name:{},  Salary:{}'.format(self.name, self.salary))

也可以不加上():

class Employee:
    """这里是Employee的__doc__"""
    empCount = 0
    __name1 = 'safety'
    def __init__(self,name,salary):
        self.name = name
        self.salary = salary
        Employee.empCount += 1
    
    def display_count(self):
        print('Totall employee count:{}'.format(Employee.empCount))
    
    def display_employee(self):
        print('Name:{},  Salary:{}'.format(self.name, self.salary))

目前我观察的结果是:二者没有区别;实际上它们有无区别呢?如果真的没有区别,那么哪种写法是正确的?我在《Python基础教程》中看到的是不加括号。

阅读 23.1k
5 个回答

事实上是没有区别的,以下三种写法是等价的

class A:
    pass
    
class A():
    pass
    
class A(object):
    pass

不需要继承类的话,可加可不加

不加括号的,或者加括号未继承其他类的是经典类(旧式类) ,加括号继承其他类或者Object的是新式类

python3中都是新式类

在《流畅的python》中第一章第3页有一个类是这样的:

class FrenchDeck:
    ranks = ...

然后,在第 6 页的页脚有这样的一个注释:

在 Python2 中,对 object 的继承需要显式地写为 FrenchDeck(object);而在 Python 3 中,这个继承关系是默认的。

可以不写吧,这个的区别并不是很大,主要是带括号的这个类很有可能会用来作为继承的操作,所以会加上,但是普通情况下是没有区别的
以下是在有括号而没有继承的情况下IDE的提示:

clipboard.png

可以看到没有继承的情况下类上写了括号会被IDE当做多余的符号......

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏