Python中类-带括号与不带括号的区别

发表于:2022-3-11 09:36

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:全栈测试开发日记    来源:CSDN

  引言
  有时候看到群里一些人问一些基础的知识,虽然很基础,网上随便一查即可知道,但是往往很多人就是连这些基础的知识都很模糊,甚至不清楚,这里再来复习一下python中类的一个知识点(仅此)。
  类的定义
  用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  举个生活栗子,一个公司可以看作一个类,公司下的部门,可以方法,公司有很多不同级别的领导,可以看作是属性,部门可以有很多,领导可以是BOSS,也可以是小部门的领导。所以一个类下面可以有多个方法和多个属性,属性可以只属于某个方法,也可以是全局的。
  类的创建
  python3创建类的方式有两种,一种带括号,一种不带括号。
  class Test:
      def __init__(self,x):
          self.x = x
      def outprint(self):
          return self.x
  class Test2:
      def __init__(self,x):
          self.x = x
      def outprint(self):
          return self.x
  class Test3(object):
      def __init__(self,x):
          self.x = x
      def outprint(self):
          return self.x
  a = Test
  b = Test2
  c = Test3
  print(a)
  print(b)
  print(c)
  print(a(1))
  print(b(1))
  print(c(1))
    
  运行结果:
  <class '__main__.Test'>
  <class '__main__.Test2'>
  <class '__main__.Test3'>
  <__main__.Test object at 0x000001A6A7E88668>
  <__main__.Test2 object at 0x000001A6A7E88668>
  <__main__.Test3 object at 0x000001A6A7E88668>
    
  结论:由此可见,python3创建类的时候,可以不带括号,也可以带,也可以显示继承object,如果带个()空括号,其实也是隐士的继承了object。这三种方式是相等的。
  赋值
  上面已经讲了类的创建,在讲类的实例化之前,先说一下赋值。
  Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。
  等号(=)用来给变量赋值。
  等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。例如:
  a = None
  print(id(a))
  print(id(None))
  print(a == None)
    
  运行结果:
  1625859280
  1625859280
  True

  结论:可以看出,a赋值了None后,a 与None指向同一个内存地址,并且值也相等,所以a == None 是True。
  我之前讲过,python对象三个基本要素:id,value,type。id是对象的唯一标识,value对象的值,type标识对象的类型。所有变量即对象。
  上面a is None的话,就是通过id来判断,如果是a == None的话,就是通过value来判断。
  类的实例化
  上面赋值我们用的是“等号”,是针对变量的。其实在讲类的创建,也用了“=”号来赋值。
  什么是实例化? “类提供默认行为,是实例的工厂”,打个比方,车是类,别克凯越是类的实例。  
  类的实例化只有一种方式,就是实例化的时候,需要带括号,这个括号根据实际情况可以为空,也可以传参。看例子:
  class Test:
      def __init__(self,x):
          self.x = x
      def outprint(self):
          return self.x
  class Test_1(object):
      def __init__(self,x):
          self.x = x
      def outprint(self):
          return self.x
  # 给类起一个别名
  a = Test
  # 实例化类
  b = Test(1)
  # 实例化类
  c = Test_1
  print(a)
  print(a == Test)
  print(b)
  print(Test(1))
  print(id(b))
  print(id(Test(1)))
  print(b == Test(1))
  print(c)
  # 赋值
  d = a
  print(id(Test))
  print(id(a))
  print(id(d))
  print(a == d)
  # 获取当前类的属性列表
  print(dir(a))
  print(dir(c))

    
  运行结果:
  <class '__main__.Test'>
  True
  <__main__.Test object at 0x00000168B1458630>
  <__main__.Test object at 0x00000168B1458668>
  1549162350128
  1549162350576
  False
  <class '__main__.Test_1'>
  1549339665432
  1549339665432
  1549339665432
  True
  ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'outprint']
  ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'outprint']
  Process finished with exit code 0
    
  结论:我把前面的例子也写进来了,就是方便理解,有点多,但要耐心点看。
  上面的结果告诉我们:python的类,带括号是实例化,不带括号是赋值。(记住这个)

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号