DAY15 面向对象初始

Posted hebbhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DAY15 面向对象初始相关的知识,希望对你有一定的参考价值。

初识面向对象

   在python之中,一切皆对象。面向对象编程(OOP)是一种编程思想,把对象作为编程的单元,使得程序更加容易拓展。

   面向对象编程的一些专业名词:

     类 :具有相同属性和功能的一类事物。

     对象/实例 :类的具体实现。

     实例化 :类--->对象的过程。

类是什么?

    类:具有相同属性或者功能的一类事物。

class A:
    name = ‘he‘   #属性(静态属性)/静态变量/静态字段

    def func1(self):  #动态属性/方法
        pass

     通过上面的代码,我们创建了一个类A,接下来我们来看看具体的定义:

   class :定义类的关键字,类似于def。

   name = ‘he’ :类的属性,又称为静态属性/静态字段/静态变量。

    def func1(self):pass  : 这个类似于函数的东西,在类中称为方法,也称为动态属性。

  总结:从上面我们可以得到,一个类主要有两部分组成,类的属性+类的方法

类名的使用:操作类的属性

    首先,我们必须明白一个概念。类,是一个公共模型,是一个公共的框架。

class Person:
    animal = ‘高级动物‘             #类的属性
    walk_way = ‘直立行走‘           
    language = ‘语言‘
    
    def eat(self):                 #类的方法
        print(‘吃吃吃,喝喝喝‘)
    def work(self):
        print(‘人类都需要工作‘)
    

   如果知道一个类究竟有哪些属性以及方法?此时“__dict__”方法就能帮到我们。

      __dict__ :   查看类/对象中的所有属性以及方法,并返回一个字典。

class Person:
    animal = ‘高级动物‘
    walk_way = ‘直立行走‘
    language = ‘语言‘
    
    def eat(self):
        print(‘吃吃吃,喝喝喝‘)
    def work(self):
        print(‘人类都需要工作‘)


#(1)通过__dict__方法查看类Person中的所有属性以及方法
print(Person.__dict__)
>>>
{‘__module__‘: ‘__main__‘, ‘animal‘: ‘高级动物‘, ‘walk_way‘: ‘直立行走‘, ‘language‘: ‘语言‘, ‘__init__‘: <function Person.__init__ at 0x0000020F50318A60>, ‘eat‘: <function Person.eat at 0x0000020F50318AE8>, ‘work‘: <function Person.work at 0x0000020F50318B70>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Person‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Person‘ objects>, ‘__doc__‘: None}


#(2) 返回的是一个字典,取个值看看。
print(Person.__dict__[‘animal‘])
>>>
高级动物

#(3)既然能够取值,那么能否修改呢?
Person.__dict__[‘animale‘] = ‘低级动物‘
>>>
TypeError: ‘mappingproxy‘ object does not support item assignment       #报错了

    总结:通过以上的例子,__dict__方法的使用方法如下:

      (1)__dict__方法能够以字典的方式,把类中的所有属性和方法返回回来。对于单个的值,可以通过__dict__[key]来查询,但是只能查不能修改。。

      (2)一般在工作中,__dict__方法只用在查询类的属性以及方法上,不进行其他操作。对于增删查改类中的某个属性,某个方法,可以用到万能的点"."。

    

      类中属性的查有两种方式:1.__dict__[属性名]    2.‘类名.属性名’

class Person:
    animal = ‘高级动物‘
    walk_way = ‘直立行走‘
    language = ‘语言‘

#(1)通过__dict__查询animal的值
print(Person.__dict__[‘animal‘])
>>>
高级动物
#(2)通过万能的点 print(Person.animal) >>> 高级动物

       

#如果定义一个类中本没有的属性,那么就可以把新属性添加进去。
Person.thinking = ‘思考‘
print(Person.__dict__)                        #thinking:思考 就会新添加进去。
>>>
{‘__module__‘: ‘__main__‘, ‘animal‘: ‘高级动物‘, ‘walk_way‘: ‘直立行走‘, ‘language‘: ‘语言‘, ‘__init__‘: <function Person.__init__ at 0x0000024D779689D8>, ‘eat‘: <function Person.eat at 0x0000024D77968A60>, ‘work‘: <function Person.work at 0x0000024D77968AE8>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Person‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Person‘ objects>, ‘__doc__‘: None, ‘thinking‘: ‘思考‘}

        

# 通过del语句删除类中的属性
del Person.walk_way
print(Person.walk_way)
>>>
AttributeError: type object ‘Person‘ has no attribute ‘walk_way‘    #类中没有该属性

       

#如果一个现有的属性,想更改他对应的值。
Person.animal = ‘低等动物‘
print(Person.animal)
>>>
低等动物

类名的使用:操作类的方法

   类中的方法,一般不直接通过类名来操作,而是通过对象来操作类的方法。

#方法一:通过__dict__方法来执行类的方法(骚操作,不建议使用)
Person.__dict__[‘work‘](‘alex‘)
>>>
人类都需要工作

#方法二:通过万能的点(不建议使用)
Person.work(‘alex‘)
>>>
人类都需要工作

 

对象是什么?

   对象:类的具体实现,类的实例化。

#类的实例化
he = Person()   #这样就实例化了一个对象,在内存空间中开辟了一个对象空间。

     看到这里,我们可能会比较懵圈,究竟怎么样产生的一个对象?接下来,__init__(self)特殊方法就该登场了。

__init__()特殊方法

   __init__()方法的第一个参数必须是self,在类的实例化过程中执行。

class Person:
    animal = ‘高级动物‘
    walk_way = ‘直立行走‘
    language = ‘语言‘

    def __init__(self,name,age,eye):    #特殊方法,给对象封装属性。
        print(self)
        self.name = name                     #给对象增加一个属性
        self.age = age
        self.eye = eye


    def eat(self):
        print(‘吃吃吃,喝喝喝‘)
    def work(self):
        print(‘人类都需要工作‘)


#此时,你会好奇,self这个参数究竟是何方神圣??于是,立马实例化一个对象
he = Person(‘he‘,23,‘small eye‘)      #实例化了一个对象he,手动把实参传入,self去哪了??
print(he)
>>>
<__main__.Person object at 0x000002CC8FE0E128>
<__main__.Person object at 0x000002CC8FE0E128>

#两个内存地址是一样的,证明self就是he这个对象。

   类的实例化过程中其实有三个步骤:

  (1)执行类的实例化过程,会在内存中创建一个对象空间,其中有一个类对象指针,能够指向类的内存空间。

  (2)自动执行__init__()特殊方法,把对象空间自动传给self参数,其他所需参数需要手工传递。

  (3)执行__init__()方法的具体逻辑,给对象空间封装属性。

对象操作对象空间

he = Person(‘he‘,23,‘small eye‘)    #实例化一个对象,he这个对象自动传给参数self,其他参数需要填入。
print(he.__dict__)                       #查看对象空间的所有属性和方法
>>>
{‘name‘: ‘he‘, ‘age‘: 23, ‘eye‘: ‘small eye‘}

#属性的查
print(he.name)
>>>
he

#属性的增
he.sex = ‘male‘
print(he.__dict__)
>>>
{‘name‘: ‘he‘, ‘age‘: 23, ‘eye‘: ‘small eye‘, ‘sex‘: ‘male‘}

#属性的改
he.eye = ‘big eye‘
print(he.eye)
>>>
big eye

#属性的删除
del he.eye
print(he.__dict__)
>>>
{‘name‘: ‘he‘, ‘age‘: 23}

对象操作类空间的属性以及方法

#对象操作类空间的属性, 只能查看类中的属性,不能修改。
print(he.animal)                  #类只能查看类中的属性
he.animal = ‘低等动物‘          #看似改变类的属性,其实就是给对象新增一个对象
print(Person.animal)
print(he.__dict__)
>>>
高级动物
高级动物
{‘name‘: ‘he‘, ‘age‘: 23, ‘eye‘: ‘small eye‘, ‘animal‘: ‘低等动物‘}


#对象操作类中的方法(推荐)
he = Person(‘he‘,23,‘small eye‘)
he.eat()
>>>
吃吃吃。。

   问题一: 对象为什么能够调用类中的属性与方法?

   答:因为对象空间中存在着类对象指针,对象会先在对象空间中寻找,如果找不到,会到类空间中寻找。。

   问题二: 对象与对象之间能够互相调用吗?

   答:同一个类实例化出来的对象之间是不能互相调用的;但是不同类实例化出来的对象,可以互相调用。

   问题三: 如果给对象封装属性?

   答: 方式一:通过__init__()特殊方法,给对象封装属性。

      方式二:如果有特殊属性,在任何位置都可以增加。

技术分享图片

 

 

 

 

  

      

 

 

 

 









以上是关于DAY15 面向对象初始的主要内容,如果未能解决你的问题,请参考以下文章

day18

day24 面向对象,交互,组合,命名空间,初始继承

day15-面向对象总结

Day06-面向对象编程

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程