低调的基类--object
Python中一切皆为对象,类也不例外,类也是一个对象。
object是所有类的基类。
世界上最简单的类
# -*- ecoding: utf-8 -*- # @ModuleName: samplest_demo # @Function: # @Author: 甲壳虫~~~ # @Time: 2021/8/30 23:04 #@blog:https://www.cnblogs.com/liveforlearn class A: pass print(A.__class__) #output:<class ‘type‘> print(A.__class__.__base__) #output: <class ‘object‘>
每个Python类的定义都会隐式的集成来自object类,类定义就是对type类的一个对象的声明,基类(父类)为object。
派生自object类中的对象方法,也将继承各自相应的默认实现。某些情况下,基类中一些特殊方法的默认行为,也正是我们想要的。
基类中的__init__()
object最为所有类的基类,已经为__init__方法提供了默认的实现,一般情况下不需要重写这个函数。如果没有对它进行重写,那么在创建对象时不会产生其他变量的实例。
从下面的例子可以看出超级基类已经实现了__init__()方法。
# -*- ecoding: utf-8 -*- # @ModuleName: samplest_demo # @Function: # @Author: 甲壳虫~~~ # @Time: 2021/8/30 23:04 #@blog:https://www.cnblogs.com/liveforlearn print(dir(object)) #output:[‘__class__‘, ‘__delattr__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__init_subclass__‘, ‘__le__‘, ‘__lt__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘]
延迟赋值
e.g:
# -*- ecoding: utf-8 -*- # @ModuleName: samplest_demo # @Function: # @Author: 甲壳虫~~~ # @Time: 2021/8/30 23:04 #@blog:https://www.cnblogs.com/liveforlearn class Study: def get_knowledge(self): return self.learn_time * self.learn_efficiency s = Study() s.learn_time, s.learn_efficiency = 3, 2 print(s.get_knowledge()) #output :6
定义在类Study中的函数get_knowlede在返回值时使用了两个属性,可是没有在任何地方对其进行赋值,但是在Python这是允许的。
但是这样的做法,给调用者带来了潜在的困惑,因此要尽量避免。
易错问题
下面来看一个初学者经常出错的问题:
从这里可以看出类中的“self是类实例化产生的对象本身的指代,而不能指代此类本身”
# @ModuleName: samplest_demo # @Function: # @Author: 甲壳虫~~~ # @Time: 2021/8/30 23:04 #@blog:https://www.cnblogs.com/liveforlearn class Study: def get_knowledge(self): return self.learn_time * self.learn_efficiency s = Study s.learn_time, s.learn_efficiency = 3, 2 print(s.get_knowledge()) #output :TypeError: get_knowledge() missing 1 required positional argument: ‘self‘