一、面向对象
编程的方式:
- 面向过程
- 把一件事情拆分成步骤
- 面向对象
- 把一件事情提炼成一类
- 类又可以实例化出对象
- 面向对象的特点:
- 封装
- 继承
- 多态
面向对象写代码先考虑有哪些类 注意: 1.类名 大驼峰命名法(每个单词的首字母大写) 2.新式类和旧式类(3.xxx默认都是新式类) 在Python2.xxx的时候 类名(object)新式类 如果不加就是旧式类 在Python3.xxx的时候 新式类 3.写类的时候 行为 属性 4.先写类 再创建对象(实例对象)
class Dog: def run(self): dog_name = input('请输入狗狗的名字:') print(f"{dog_name}会跑!") # 类进行封装的好处 xiao_bai = Dog() xiao_hei = Dog() # 对象的使用 xiao_bai.run() xiao_hei.run()
二、类和对象
1、在类的外部给实例对象添加属性-self的含义讲解
""" self存储的是实例对象的地址 即 调用者的内存地址 1.方法中具有self的方法 我们称之为实例方法 2.如果属性具有self 我们称之为实例属性 变量存的是地址 一切变量皆可引用 """ class Dog: def run(self): print("🐕会跑!") def get_name(self): print(self.name) # 给对象添加属性 xiao_bai = Dog() # 类的外部添加属性 xiao_bai.name = '小白' # 对象的使用 xiao_bai.run() print(xiao_bai.name) # 2类的内部获取实例属性 xiao_bai.get_name() # 对象默认有一个属性 _class_ print(xiao_bai.__class__) print(Dog)
2、在类的内部给实例对象添加属性
def run(): print('🐕会跑') class Dog: def __init__(self): self.name = None def set_name(self, name): self.name = name def get_name(self): print(self.name) xiao_bai = Dog() # 在类的内部给实例对象添加属性 xiao_bai.set_name("小白") xiao_bai.get_name()
3、相关概念
类:
存储的是公共的属性和方法
对象:
存储自己独有的一些属性
给实例对象添加实例属性
类的外部添加
对象名.属性名 = 数据
类的内部添加
通个调用一个实例方法
self.属性名 = 数据
实例属性最终存储的地方都是实例对象所在的空间
三、__init__( )方法
""" __int__():初始化方法,在我们使用类创建对象的时候默认会进行数据的初始化 1.init在我们创建对象的时候 会自动调用(不需要我们手动调用) """ class Dog: def __init__(self,name): self.kind = '犬类' self.name = name xiaobai = Dog("小白") xiaohei = Dog('小黑') #实例对象获取实例属性的方式 print(xiaobai.kind) print(xiaohei.kind) print(xiaobai.name) print(xiaohei.name)
四、__str__方法
# 1. __str__ 用来描述对象信息的 # 2. __str__ 应该有一个return 并且返回的是一个字符串 # 3. 字符串就是对象的描述信息 # 4. 调用时机: print(对象) 自动调用__str__方法 # 1. 创建一个英雄类Hero class Hero: # 2. 通过Hero创建的对象都应该具有 HP 和 ATK 这两个属性(int类型的) def __init__(self, HP, ATK, name): self.HP = HP self.ATK = ATK self.name = name def atk(self, enemy_hero): if self.ATK > enemy_hero.ATK: print(f"{self.name}打败了{enemy_hero.name}") else: self.HP = self.HP - enemy_hero.ATK print(f"{self.name}打不过{enemy_hero.name},当前血量:{self.HP}") def __str__(self): return f"姓名:{self.name},HP:{self.HP},ATK:{self.ATK}" # 创建第一个英雄 hero1 = Hero(100, 30, "德玛西亚") hero2 = Hero(100, 70, "亚索") hero3 = Hero(100, 10, "貂蝉") hero4 = Hero(100, 5, "提姆") # 攻击方法 print(hero1) hero1.atk(hero2) print(hero1) hero1.atk(hero3) print(hero1)
五、__del__方法
# __del__: 对象销毁的时候自动调用 # 1. 程序结束 # 2. del 对象 # 3. 不建议自己写del方法 class Dog: def run(self): print('xxx') def __del__(self): print("内存回收完毕") a = Dog() del a while True: pass
六、总结
1. 基本概念:
类: 对一些具有相同的属性和行为的对象的抽象(设计图纸)
class 类名
类名: 大驼峰命名法(所有的单词首字母大写)
类内存空间中存放的
所有的对象共有的属性或者方法
对象: 是一个实际存在的对类的实例化(有一片内存空间)
实例化对象: 类名()
对象的空间中存储的:
对象独有的数据
概念的区分:
类: 纯概念
类对象: 程序运行后类所占用的空间
实例对象: 程序运行后对象所占用的空间
实例方法: 就有self的方法就是实例方法
实例属性: 通过self定义的属性就是实例属性
self
self : 存储对象的内存空间地址的
不同的对象调用相同的方法, 但是结果却不同, 原因就是因为当对象调用方法的时候, 会把自己的内存地址传给self, 这样的话不同的对象使用self的时候代表的属性就不同了.
2. 魔法方法:
init方法
作用: 初始化属性
调用: 在创建对象的时候 会自动调用
a = Dog("小白")
str方法
作用: 描述对象的信息
str方法中应该有return , return一个字符串类型的数据
调用: print(对象名),会自动调用
del方法:
作用: 回收内存空间
调用: 销毁对象的时候,就会自动调用
3. 常见的属性添加:
在类的外部添加实例属性
对象名.属性名 = 数据
xiaobai.name = "小白"
class Dog: def set_name(self, name): self.name = name def get_name(self): print(self.name) xiaobai = Dog() # 在类的内部给实例对象添加属性 xiaobai.set_name("小白")