二 OOP object基类

低调的基类--object

  Python中一切皆为对象,类也不例外,类也是一个对象。

       object是所有类的基类。

  基类几乎什么行为都不包括,我们可以创建一个实例,但是很多事情无法完成,因为很多特殊方法的程序会跑出异常。

 

简单的实例(对象)

# -*- ecoding: utf-8 -*-
# @ModuleName: samplest_demo
# @Function: 
# @Author: 甲壳虫~~~
# @Time: 2021/8/30 23:04
#@blog:https://www.cnblogs.com/liveforlearn

a = object()

print(a)#output:<object object at 0x02E07258>
print(a.__class__)#output:<class 'object'>
print(a.__class__.__base__)#output:None

 

 

简单的类

# -*- 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这是允许的。

但是这样的做法,给调用者带来了潜在的困惑,因此要尽量避免。

“Zen of python poem” ---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'

 

posted @ 2021-08-31 00:03  甲壳虫~~~  阅读(63)  评论(0)    收藏  举报