面向对象基础

. 初始面向对象
. 面向对象的结构
. 类名操作类
. 实例化对象
. 对象操作类

面向过程与函数对比

函数与面向对象的区别
面向对象的优点

1. 是一类相似功能函数的集合体
2. 逻辑更加清晰和规范

类名首字母要大写

类,对象
类,具有相似功能与技能的一类事物
对象:类的具体表现

# 类是一个公共模板,对象就从具体的模板实例化出来
# 类里面两个部分:
#   变量
#   函数(方法)

class Human:
    """
    此类主要是构建人类
    """
    mind = "有思想"  # 静态属性
    language = "实用语言"
    l = []
    d = {}

    def __init__(self, name, sex, age, hobby):  # 方法,动态属性
        # print(self)
        # print(666)
        # print(self, name, sex, age, hobby)
        self.n = name
        self.s = sex
        self.a = age
        self.h = hobby


    def work(self):
        print("人类会工作")

    def tools(self):
        self.color = "blue"  # 给对象空间封装一个变量
        print("人类都会使用工具")

# 类名
# 类名操作类中的属性
#   第一种:类名.__dict__方式
print(Human.__dict__)
# {'__module__': '__main__', '__doc__': '\n    此类主要是构建人类\n    ', 'mind': '有思想',
# 'language': '实用语言', '__init__': <function Human.__init__ at 0x0000025D75A2AEA0>,
# 'work': <function Human.work at 0x0000025D75A2AF28>, 'tools':
# <function Human.tools at 0x0000025D75A32048>,
# '__dict__': <attribute '__dict__' of 'Human' objects>,
# '__weakref__': <attribute '__weakref__' of 'Human' objects>}
print(Human.__dict__["mind"])  # 有思想
# __dict__不能进行增删改操作
# Human.__dict__["mind"] = "无思想"

#   第二种:万能的.,可以增删改类中的静态属性
print(Human.mind)  # 有思想
#
Human.mind = "无思想"
#
Human.x = "另一个静态属性"
print(Human.x)  # 另一个静态属性
#
del Human.x
# print(Human.x)  # 报错
print(Human.l)  # []

# 类名操作类中的方法(一般只操作静态方法,类方法)
#   类名.方法名(参数)
# 比如下面这样不建议
Human.work(111)  # 人类会工作
print(Human.__dict__["work"](111)) # 人类会工作

 

# 对象
# 只要是 类名() 就是一个实例化过程,就会产生一个对象空间

# obj = Human()  # 666

# 实例化一个对象时发生了以下事情:
#   1. 产生一个空的对象空间
#   2. 自动执行类中的 __init__ 方法,并将空的对象空间传给 self
#   3. 在 __init__ 中通过 self 给这个空间添加属性,并且返回给对象,后面参数一次传入
# print(obj)  # <__main__.Human object at 0x000001F1CDB189E8>, 与上面的 print(self) 内存地址一样
obj = Human("小春", "", 18, "睡觉")  # 看到等号,先指向右边内容
print(obj)  # <__main__.Human object at 0x00000212E9448A58>
print(obj.__dict__)
# {'n': '小春', 's': '男', 'a': 18, 'h': '睡觉'}

# 对象操作对象空间的属性
#   1. obj.__init__ 查询对象中所有的属性
#   2. 通过万能的. 的方式操作对象中的单个属性

obj.job = "IT"
print(obj.__dict__)  #
# {'n': '小春', 's': '男', 'a': 18, 'h': '睡觉', 'job': 'IT'}
del obj.n  #
print(obj.__dict__)  # {'s': '男', 'a': 18, 'h': '睡觉', 'job': 'IT'}
obj.s = ""  #
print(obj.__dict__)  # {'s': '女', 'a': 18, 'h': '睡觉', 'job': 'IT'}
print(obj.s)  #

#   3. 对象可以查询类的属性(不能增删改)
print(obj.mind)  # 无思想
obj.a = 666
print(obj.a)  # 666

# 以下两个打印结果可以得知, obj这个实例对象并没有改变类Human的静态属性,只是给自己添加了一个 mind 属性
obj.mind = "新思想"
print(obj.__dict__)
print(Human.__dict__)
# 4. 对象可以执行类中的方法 # 对象执行类中的所有方法(除了三个特殊方法),Python解释器都会将对象空间主动传给方法的第一个参数 # 使用默认的 self,便于统一,self 接收的就是对象空间 # self 和 obj 在内存中指向同一个地址 print(obj) # <__main__.Human object at 0x00000231328F8AC8> obj.work() # 人类会工作 print(obj.__init__) # <bound method Human.__init__ of <__main__.Human object at 0x000001C703648908>> obj.tools() print(obj.__init__) # <bound method Human.__init__ of <__main__.Human object at 0x000001C703648908>> # 多个对象 person01 = Human("小春", "", 20, "睡觉") person02 = Human("小白", "", 18, "逛街") print(person01) print(person02) # <__main__.Human object at 0x00000254692F8AC8> # <__main__.Human object at 0x00000254692F8B00> print(person01.__dict__) # {'n': '小春', 's': '男', 'a': 20, 'h': '睡觉'} print(person02.__dict__) # {'n': '小白', 's': '女', 'a': 18, 'h': '逛街'}

 

posted @ 2019-01-14 14:40  星满夜空  阅读(150)  评论(0编辑  收藏  举报