今日大纲
一、面向对象初识
二、类名、对象的使用
三、类名称空间、对象名称空间
一、面向对象初识
1、类和对象的定义
类:具有相同属性或功能的一类事物
对象:类的具体体现
从结构上讲:面向对象可以分为两部分:属性和方法。
属性又叫静态属性、静态字段、静态变量
方法又叫动态属性、函数
class A: name = 'hello' #静态属性、静态字段、静态变量 def fun(self): #动态属性、方法、函数 pass
2、函数VS面象对象
① 函数封装一个功能,而面向对象封装多个相关的功能
② 面向对象抽象,他是一种独立的思想,要站在上帝的角度去理解
③ 程序可扩展,对象是一个个独立的。耦合性,差异性
二、类名、对象的使用
类是公共模板,公共框架
1、类名的使用
① 查看类中所有的属性和方法:__dict__。虽然__dict__也能查看类中某一个属性,但是只用来查看类中的所有属性和方法,不做其他用途
② 增删改查类中的属性:用万能的点(类中没有该属性就增,有该属性就改)
③ 操作类中的方法一般不通过类名(一般通过对象名)
class Person: animal = '高等动物' walk_way = '直立行走' langua = '语言' def __init__(self): pass def eat(self): print('吃吃吃,喝喝喝') def work(self): print('每个人都需要工作') print(Person.__dict__) #{'__module__': '__main__', 'animal': '高等动物', 'walk_way': '直立行走', 'langua': '语言', '__init__': <function Person.__init__ at 0x0000022784C75488>, .... print(Person.__dict__['animal']) #高等动物 通过__dict__方式可以查单独的属性和方法,但是不能增删改 print(Person.animal) #查 高等动物 Person.name = 'hello' #类中没有这个属性 增 Person.animal = '低等动物' #类中有这个属性 改 del Person.walk_way #删
2、对象的使用
① 实例化一个对象:对象名 = 类名(init 参数),会经历三个阶段
Ⅰ 创建一个对象名称空间,产生一个指向类名称空间的指示盘:类对象指针
Ⅱ 将该对象名称空间的地址传给__init__函数的self参数
Ⅲ 执行 __init__方法,给对象封装属性
② 对象操作对象空间
Ⅰ 对象查看对象空间的所有属性__dict__
Ⅱ 对象操作对象的某个属性,增删改查,用万用的点(对象中没有该属性就增,有该属性就减)
③ 对象操作类空间的属性,只能查
④ 对象操作类空间的方法:万能的点
class Person: animal = '高级动物' walk_way = '直立行走' language = '语言' def __init__(self,name,age,eye): self.name1 = name self.age1 = age self.eye1 = eye def eat(self): print('该吃吃,该喝喝') def work(self): print('每个人都应该要有工作') obj = Person('小明',12,'蓝眼睛') #实例化一个对象 print(obj) #<__main__.Person object at 0x00000207183C7748> print(obj.__dict__) #{'name1': '小明', 'age1': 12, 'eye1': '蓝眼睛'} #增删改查 print(obj.name1) # 查 小明 obj.sex = '男' print(obj.__dict__) # 增 {'name1': '小明', 'age1': 12, 'eye1': '蓝眼睛', 'sex': '男'} obj.eye1 = '黄眼睛' print(obj.__dict__) # 改 {'name1': '小明', 'age1': 12, 'eye1': '黄眼睛', 'sex': '男'} del obj.eye1 print(obj.__dict__) # 删 {'name1': '小明', 'age1': 12, 'sex': '男'} print(obj.animal) #高级动物 obj.animal ='低级动物' #只是在obj的空间里增加属性 animal = '低级动物' #调用类中的方法 obj.eat() #该吃吃,该喝喝
三、类名称空间、对象名称空间
类的执行过程:
class GameRole: rule = '游戏规则' def __init__(self,area,nickname,hp,ad): self.area = area self.nickname = nickname self.hp = hp self.ad = ad def attack(self): print('施展了一个攻击') gailun = GameRole('德玛西亚','草丛伦',10000,75) yasuo = GameRole('艾欧尼亚','托儿所',500,150)
执行过程:
① 遇到类名创建一个类名称空间,空间中包含类中的所有属性和方法
② 实例化一个对象,创建一个对象空间,产生一个指向类名称空间的指示盘:类对象指针,并将对象的空间地址传给__init__的参数self
③ 执行init方法,给对封装init里有的属性
1、对象只能调用类空间的属性和方法,不能进行增删改。因为对象空间中有指向类的类对象指针。调用方法:对象名.属性
在查看一个属性时,会先从对象空间中找,没有此属性会通过类对象指针从类中寻找,类中找不到会从父类中找。
2、类不能调用对象的属性
3、对象与对象之间能不能互相调用?
同一个类实例化的对象之间不能互相访问
不同实例化对象之间有可能互相访问
4、可以在任何位置给对象封装属性
① 直接用万能的点
② 在类中定义一个函数,对象调用这个函数。
class GameRole: rule = '游戏规则' def __init__(self,area,nickname,hp,ad): self.area = area self.nickname = nickname self.hp = hp self.ad = ad def attack(self): print('施展了一个攻击') def pen(self): self.pen=10000 gailun = GameRole('德玛西亚','草丛伦',10000,75) yasuo = GameRole('艾欧尼亚','托儿所',500,150) penzi = GameRole('中国','键盘侠',10,100) penzi.pen() print(penzi.__dict__) #{'area': '中国', 'nickname': '键盘侠', 'hp': 10, 'ad': 100, 'pen': 10000}