面向对象
一、面向对象
- 优点:
- 面向对象编程:是一类相似功能函数的集合,使你的代码更清晰化,更合理化。
- 面向对象,要拥有上帝的视角看问题,类其实就是一个公共模板,对象就从具体的模板实例化出来
- 类:就是具有相同属性和功能的一类事物。
- 对象:就是类的具体表现。
二、类的初识
2.1、类的基本结构
- 关键字
- class + 类名
class Human:
'''
此类主要是构建人类
'''
mind = '有思想'
dic = {}
li = []
def work(self):
print("人类会开飞机")
Human是此类的类名,类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头。
类的结构从大方向来说就分为两部分:
静态变量。
动态方法。
三、从类名的角度研究类
3.1、类名操作静态属性
3.1.1、第一种,查看类中的所有内容:类名.__dict__方式。
class Human:
mind = '有思想'
dic = {}
li = []
def work(self):
print("人类会开飞机")
print(Human.__dict__) #{'__module__': '__main__', 'mind': '有思想', 'dic': {}, 'li': [], 'work': <function Human.work at 0x00000232E7D6A438>, '__dict__': <attribute '__dict__' of 'Human' objects>, '__weakref__': <attribute '__weakref__' of 'Human' objects>, '__doc__': None}
print(Human.__dict__['mind']) #有思想
Human.__dict__['mind'] = '无脑'
print(Human.__dict__) # 错误
#通过这种方式只能查询,不能增删改.
3.1.2、万能的点 . (通过.可以改变类属性的值)
class Human:
mind = '有思想' # 第一部分:静态属性 属性 静态变量 静态字段
dic = {}
l1 = []
def work(self): # 第二部分:方法 函数 动态属性
print('人类会工作')
print(Human.mind) # 查
Human.mind = '无脑' # 改
print(Human.mind)
del Human.mind # 删
Human.walk = '直立行走'
print(Human.walk)
# 通过万能的点 可以增删改查类中的单个属性
对以上两种做一个总结:如果想查询类中的所有内容,通过 第一种__dict__方法,如果只是操作单个属性则用万能的点的方式。
3.2 类名操作动态方法
- 前提:除了两个特殊方法:静态方法,类方法之外,一般不会通过类名操作一个类中的方法。
class Human:
"""
此类主要是构建人类
"""
mind = '有思想' # 第一部分:静态属性 属性 静态变量 静态字段
dic = {}
l1 = []
def work(self): # 第二部分:方法 函数 动态属性
# print(self)
print('人类会工作')
def tools(self):
print('人类会使用工具')
Human.work(111)
Human.tools(111)
下面可以做,但不用。
Human.__dict__['work'](111)
四、从对象的角度研究类
4.1、什么是对象?
-
对象是从类中出来的,只要是类名加上(),这就是一个实例化过程,这个就会实例化一个对象。
-
实例化一个对象总共发生了三件事:
- 在内存中开辟了一个对象空间
- 自动执行类中的__init__方法,并将这个对象空间(内存地址)传给了__init__方法的第一个位置参数self
- 在__init__ 方法中通过self给对象空间添加属性
示例:
class Human:
mind = '有思想'
language = '使用语言'
def __init__(self,name,sex,age,hobby):
# self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
self.n = name
self.s = sex
self.a = age
self.h = hobby
obj = Human('barry','男',18,'运动')
print(obj.h)
print(obj.s)
print(obj.a)
4.2、查询对象中所有的属性,用 对象名.dict
class Human:
mind = '有思想'
language = '实用语言'
def __init__(self,name,sex,age,hobby):
# self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
self.n = name
self.s = sex
self.a = age
self.h = hobby
obj = Human('barry','男',18,'运动')
print(obj.__dict__) # {'n': 'barry', 'h': '运动', 's': '男', 'a': 18}
4.3、操作对象中的单个属性。 用万能的点 .
class Human:
mind = '有思想'
language = '实用语言'
def __init__(self,name,sex,age,hobby):
# self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
self.n = name
self.s = sex
self.a = age
self.h = hobby
obj = Human('barry','男',18,'运动')
obj.job = 'IT' # 增
del obj.n # 删
obj.s = '女' # 改
print(obj.s) # 查
print(obj.__dict__)
4.4、查看类中的属性
class Human:
mind = 'xxx'
language = 'ttt'
def __init__(self,name,sex,age,hobby):
self.n = name
self.s = sex
self.a = age
self.h = hobby
obj = Human('barry','男',18,'运动')
print(obj.mind)
print(obj.language)
obj.a = 666
print(obj.a) #666
4.5、操作类中的方法
class Human:
mind = '有思想'
language = '实用语言'
def __init__(self,name,sex,age,hobby):
self.n = name
self.s = sex
self.a = age
self.h = hobby
def work(self):
print(self)
print('人类会工作')
def tools(self):
print('人类会使用工具')
obj = Human('barry','男',18,'运动')
obj.work()
obj.tools()
类中的方法一般都是通过对象执行的(除去类方法,静态方法外),并且对象执行这些方法都会自动将对象空间传给方法中的第一个参数self.
self 是什么?
- self其实就是类中方法(函数)的第一个位置参数,只不过解释器会自动将调用这个函数的对象传给self。所以咱们把类中的方法的第一个参数约定俗成设置成self, 代表这个就是对象。