一 对象的概念
”面向对象“的核心是“对象”二字,而对象的精髓在于“整合“
所有的程序都是由”数据”与“功能“组成,因而编写程序的本质就是定义出一系列的数据,然后定义出一系列的功能来对数据进行操作。在学习”对象“之前,程序中的数据与功能是分离开的,如下
# 数据:name、age、sex name='lili' age=18 sex='female' # 功能:tell_info def tell_info(name,age,sex): print('<%s:%s:%s>' %(name,age,sex)) # 此时若想执行查看个人信息的功能,需要同时拿来两样东西,一类是功能tell_info,另外一类则是多个数据name、age、sex,然后才能执行,非常麻烦 tell_info(name,age,sex)
在学习了“对象”之后,我们就有了一个容器,该容器可以盛放数据与功能,所以我们可以说:对象是把数据与功能整合到一起的产物,或者说”对象“就是一个盛放数据与功能的容器/箱子/盒子。
如果把”数据“比喻为”睫毛膏“、”眼影“、”唇彩“等化妆所需要的原材料;把”功能“比喻为眼线笔、眉笔等化妆所需要的工具,那么”对象“就是一个彩妆盒,彩妆盒可以把”原材料“与”工具“都装到一起
在了解了对象的基本概念之后,理解面向对象的编程方式就相对简单很多了,面向对象编程就是要造出一个个的对象,把原本分散开的相关数据与功能整合到一个个的对象里,这么做既方便使用,也可以提高程序的解耦合程度,进而提升了程序的可扩展性(需要强调的是,软件质量属性包含很多方面,面向对象解决的仅仅只是扩展性问题)
二 类与对象
类即类别/种类,是面向对象分析和设计的基石,如果多个对象有相似的数据与功能,那么该多个对象就属于同一种类。有了类的好处是:我们可以把同一类对象相同的数据与功能存放到类里,而无需每个对象都重复存一份,这样每个对象里只需存自己独有的数据即可,极大地节省了空间。所以,如果说对象是用来存放数据与功能的容器,那么类则是用来存放多个对象相同的数据与功能的容器。
综上所述,虽然我们是先介绍对象后介绍类,但是需要强调的是:在程序中,必须要事先定义类,然后再调用类产生对象(调用类拿到的返回值就是对象)。产生对象的类与对象之间存在关联,这种关联指的是:对象可以访问到类中共有的数据与功能,所以类中的内容仍然是属于对象的,类只不过是一种节省空间、减少代码冗余的机制,面向对象编程最终的核心仍然是去使用对象。
# 类定义阶段发生的三件事
# 1、会执行类体的代码
# 2、会产生一个类的名称空间,用来将类体代码运行过程中产生的名字都丢进去
# 3、将名称空间的内存地址绑定给类名
# 调用类也发生了三件事
# 1、会创建空对象(调用__new__方法来创建的空对象)
# 2、会自动触发类中__init__函数的运行,__init__(空对象,,"egon",18,"male"),完成对象的初始化操作,注意:__init__不能有返回值
# 3、返回该对象,赋值给stu1_dic
三 面向对象编程
详见:https://zhuanlan.zhihu.com/p/109292504
https://www.cnblogs.com/linhaifeng/articles/6182264.html#_label4
##隐藏属性
# 隐藏属性的真正目的就是为了不让使用者在类外部的直接操作属性 """ class People: __country = "CHINA" def __init__(self,name,age): self.__name = name self.age = age def __tell(self): print('====>tell') obj = People('egon',18) # print(People.__country) # print(People.__tell) # print(obj.__name) # print(obj.age) # print(People.__dict__) # print(obj.__dict__) # print(obj._People__name) # print(obj._People__country) # print(obj._People__tell) """ # __开头的属性隐藏有四个特点: # 1、并不是真正的隐藏,只是一种语法意义上的变形 # 2、该变形操作只在类定义阶段扫描语法时发生一次,类定义之后__开头的属性不会变形 # 3、该隐藏对外不对内 # class People: # def __init__(self,name,age): # self.__name = name # self._People__name = name # self.age = age # # def tell(self): # print(self.__name) # self._People__name # # obj = People('egon',18) # obj.__gender = "male" # print(obj.__gender) # print(obj.__dict__) # obj.tell() # 1、隐藏数据属性的目的: 为了严格控制某一属性的操作 class People: def __init__(self,name,age): self.__name = name self.age = age def get_name(self): print("名字:%s" %self.__name) def set_name(self,v): if type(v) is not str: print("名字必须是str类型小垃圾") return self.__name = v obj = People('egon',18) # obj.get_name() # obj.set_name(123) # obj.get_name() # 2、隐藏函数属性的目的:隔离复杂度