一 对象的概念

”面向对象“的核心是“对象”二字,而对象的精髓在于“整合“

所有的程序都是由”数据”与“功能“组成,因而编写程序的本质就是定义出一系列的数据,然后定义出一系列的功能来对数据进行操作。在学习”对象“之前,程序中的数据与功能是分离开的,如下

# 数据: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、隐藏函数属性的目的:隔离复杂度

  

 

posted on 2021-04-12 20:28  lzl_121  阅读(56)  评论(0编辑  收藏  举报