Python学习08:面向对象思想
Posted CQ小子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习08:面向对象思想相关的知识,希望对你有一定的参考价值。
本文学习Python的笔记,仅供参考
原来大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
以上是关于Python学习08:面向对象思想的主要内容,如果未能解决你的问题,请参考以下文章