python之路---面向对象编程思想及类

编程思想:

    1:面向机器编程

          机器语言以及汇编语言都是面向机器编程,以最原始的二进制以及英文字符去直接操作计算机硬件,虽然执行效率极高,但是开发效率低下,且出错率高

    2:面向过程编程:

          从解决问题的步骤角度出发,先干什么,后干什么,好似一条流水线生产,将复杂的问题流程化,从而简单化,如典型的面向过程语言:C,但是面条式的程序,扩展性不高

    3:结构化程序设计:采用子程序,代码块,for循环,while循环来代替面向过程语言中的goto,以避免面条式的代码出现

    4:面向对象编程:解决面向过程编程的扩展性低的问题,基于该思想编程就好比在创造世界,是一种上帝式的思维方式,但是编程复杂度高于面向过程

 什么是对象:对象是特征和功能的结合体,如桌子这个对象,特征是四四方方(当然也可能是圆的...),功能是吃饭的时候放菜等等...

 什么是类:类是一类拥有相同特征和功能的对象的结合体,如人是对象,而人类即类

  注意:在现实世界中是现有对象才有类这个概念的,而在python中先有类,才有对象

   定义类:

扫描二维码关注公众号,回复: 2692945 查看本文章
 class Information:    #使用骆驼峰风格
     name = 'bob'

     def func(self):
         print('python')

在定义类的过程中就开始执行类体代码(与函数不同),并创建了类的名称空间,将执行类体代码过程中产生的名字存放于该空间(这里是name:指向‘bob’的内存地址,func:指向函数体的内存地址),可以说类的本质就是名称空间,用于存放类的属性(可以将其分为:数据属性和函数属性---来源于egon老师)

我们可以通过类名.__dict__查看类下的属性

我们可以在类内对名字(属性)进行增/删/改/查:

# print(Information.name) --->查

# Information.name='tom'
# print(Information.name) --->改

# Information.job = 'PHP'
# print(Information.job)  --->增

# del Information.name
# print(Information.name) --->删

 在类内定义的函数是类的属性,类可以调用(就是调用普通函数,所以得遵循函数的调用原则)

<function Information.func at 0x0157EB70>
#--->是function

调用类的过程叫做类的实例化,实例化的结果是产生类的对象/类的实例

a = Information()
b = Information()
c = Information()
print(a)
print(b)
print(c)

#<__main__.Information object at 0x031936D0>
#<__main__.Information object at 0x031937B0>
#<__main__.Information object at 0x031937D0>

 产生三个不同的对象,其本质仍然是名称空间,这三个对象拥有相同的特征与功能(这些共有属性存放在类这个名称空间中),而自己独有的属性存放在自己的名称空间中

class Information:    #使用骆驼峰风格
    name = 'bob'

    def func(self):
        print('python')

a = Information()
b = Information()
c = Information()
print(a.__dict__)
a.job = 'python'
b.job = 'JAVA'
print(a.name,b.name,c.name)
print(a.job,b.job)
--->
{}
bob bob bob
python JAVA

 上述是在对象产生后为对象添加属性的方法(在刚刚产生时是没有自己独有属性的,结果为{}),那么如何在对象产生的过程中(类的实例化阶段)为其添加独有的属性?

class Information:    #使用骆驼峰风格
    name = 'bob'
    def __init__(self,x,y):
        self.x = x
        self.y = y

    def func(self):
        print('python')


a = Information('bob','python')
b = Information('tom','JAVA')
print(a.__dict__)
print(b.__dict__)
--->
{'x': 'bob', 'y': 'python'}
{'x': 'tom', 'y': 'JAVA'}

 上述代码实际上是发生了两件事情:

  1:调用类的时候产生了空对象,2:自动触发__init__(构造方法),将对象(通过self)以及括号内的参数传入

  对象属性的查找顺序是:自身的内存空间--->类的内存空间---->报错

 类中定义的属性(数据属性和函数属性)是对象共享的,而对象只有数据属性,且是独有的

 类内定义的函数,对象是可以使用的,但是是通过绑定的方法(不同于函数调用),绑定的效果是:绑定给谁,就给谁调用, 并且将调用的对象作为第一个参数传入

class Information:    #使用骆驼峰风格
    name = 'bob'
    def __init__(self,x,y):
        self.x = x
        self.y = y

    def func(self):
        print('python')

a=Information(1,2)
print(Information.func)
print(a.func)
--->
#<function Information.func at 0x0084EB70>
#<bound method Information.func of <__main__.Information object at 0x008B31F0>>

   注:1:在类内定义的函数,类是可以调用的,但是大多数情况下是给对象使用的,所以在类内定义的函数应该自带一个 self(用于将对象这个名称空间传入,对于以往直接传参数是个很神奇的方法)

           2:类调用类内的函数就是在调用一个普通的函数,但是对象更应该称之为在调用绑定方法

python3统一了类与类型的概念--->类即类型

 对于我们创建一个列表L=[1,2,3],实际上是完成了L=list([1,2,3])过程,那么类即类型,对于list这个类来说,L=list([1,2,3])实际上是完成了类的实例化过程,而L.append()这些方法本质上是在调用list类内定义的函数(即在调用绑定方法)

L = [1,2,3]
l=[1]
L.append(4)
list.append(L,5)
print(L,l)
--->
[1, 2, 3, 4, 5] [1]
#这个结果说明了:
#1.L.append(4)与list.append(L,5)的效果一致
#L.append(4)比没有为l添加属性说明,绑定给谁,就由谁调用,并且把谁作为参数传入,4是L独有的属性
L = [1,2,3]
print(type(L))
print(L.append)
--->
#<class 'list'>
#<built-in method append of list object at 0x02F50800>
说明:其实就是一个实例对象,调用append就是在调用类的绑定方法

 所以对象是高度整合的产物:整合了数据和专门处理数据的方法

     

猜你喜欢

转载自blog.csdn.net/ltfdsy/article/details/81434346