原来大Python也有面向对象的思想啊,看来思想是唯一的,产物的多样的。 C++/JAVA 等!


面向过程:程序都是按照顺序一个一个执行,这种变成方式侧重于程序执行的流程。

面向对象:程序可以看做一组对象的集合,每个对象在不断进行交互,这种编程的方式侧重与将事物抽象成一个对象,并注明属性和方法

面向对象的设计思想是从自然界中来的,因为在自然界中,类(Class)和实例(Instance)的概念是很自然的。Class是一种抽象概念,比如我们定义的Class——Student,是指学生这个概念,而实例(Instance)则是一个个具体的Student,比如,Bart Simpson和Lisa Simpson是两个具体的Student。所以,面向对象的设计思想是抽象出Class,根据Class创建Instance。

类和实例

要谈面向对象,就要先有对象,对象就是类的一个实例。在人类的认知中,属性相近的东西会被归为一类,并给类别命名,面向对象就模拟了人类认知的过程。把抽象的类进行实例化就称为对象。

比如我这边定义一个学生类,这个类里面有姓名,年龄,学校等属性信息,如下定义了一个类,属性的部分可以自由添加了

>>> class Student(object):
	pass

>>>

根据类,声明一个对象,可以看到a是一个指针指向了这个新生成的对象

>>> a = Student()
>>> print(a)
<__main__.Student object at 0x000000D3E058B4A8>

初始化名字,叫zhangsan

>>> a.name = "zhangsan"
>>> a.name
'zhangsan'

在C++中我们知道,每一个类都有一个构造函数,在声明类的时候,会自动调用构造函数,这个构造函数可能需要对新生成的对象进行初始化,其实在Python应该也是有的,但是至少有一个__ini__方法是可以声明的,比如:

class Student(object):
    def __init__(self,name):
        self.name = name
    def print_name(self):
        print(self.name)
    
bat = Student("zhangsan")

print(bat)
print(bat.name)

看下执行的结果:

======================== RESTART: E:/python/class.py ========================
<__main__.Student object at 0x000000386F52E978>
zhangsan

一开始构造的时候就将name这个属性进行初始化。

数据的封装

面向对象的一大特点,可以将所有的属性进行封装,通过内部方法来进行展示,参考下面的例子:


class Student(object):
    def __init__(self,name):
        self.name = name
    def print_name(self):
        print(self.name)
    
bat = Student("zhangsan")

bat.print_name()



我们知道bat初始化的时候name = zhangsan,如果我们想知道name的话,可以直接调用自己的方法print_name来获取name

通过上面的实例,我们直接操作了对象内部的数据,但是无需知道内部是如何实现的。

访问限制

这部分也是老生常谈的话题,就是权限的问题,在类中,属性和方法都具有权限的,一般情况下是public权限,但是如果数据不想被别人知道可以使用private的权限,不对外开放,这样就无法从外部获取变量内容,只能通过接口去获取。比如我修改下name的权限,改成__name 就变成private了,然后去访问。

class Student(object):
    def __init__(self,name):
        self.__name = name
    def print_name(self):
        print(self.__name)
    
bat = Student("zhangsan")

print(bat.__name)

输出结果报错,没有权限访问

======================== RESTART: E:/python/class.py ========================
Traceback (most recent call last):
  File "E:/python/class.py", line 9, in <module>
    print(bat.__name)
AttributeError: 'Student' object has no attribute '__name'
>>>

不过还是可以通过方法来获取:

======================== RESTART: E:/python/class.py ========================
zhangsan

这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。


假设需要外部修改这个变量怎么办,也可以设置一个方法set_name来修改,可以参考代码


class Student(object):
    def __init__(self,name):
        self.__name = name
    def print_name(self):
        print(self.__name)
    def set_name(self,name):
        self.__name = name
    
bat = Student("zhangsan")

bat.print_name()

bat.set_name("lisi")

bat.print_name()

运行结果:

======================== RESTART: E:/python/class.py ========================
zhangsan
lisi