面向对象
- 与面向过程对比:
- 面向过程:数学逻辑的映射,学会做个好员工
- 面向对象:生活逻辑的映射,学会做个好领导
- 官方定义:
- 类:具有相同特征(属性和行为)的事物的抽象
- 对象:某个类的具象
- 编程语言:
- 类:是一种自定义的数据类型
- 对象:某个类类型的变量
面向对象语法
-
类的定义:
class 类名:
内容 -
语法说明:
- 定义类需要使用关键字class
- 类名:原则上只要符合标识符命名规范即可,但是通常我们都使用大驼峰(每个单词首字母大写)风格命名
- 如:UserName
- 类名后面的’:'不要忘记
- 类的内容要进行整体缩进
- 行为:通过方法体现,在类中定义相关的函数即可(第一个参数通常是self)
- 属性:通过变量体现,在需要时动态添加,很多时候定义类时没有体现
- 成员访问:
- 属性:对象.属性名
- 方法:对象.方法名()
-
示例:
# 定义类
class Person:
# 行为通过方法体现# 吃饭 def eat(self): print('红烧鸡腿我喜欢吃') # 睡觉 def sleep(self): print('睡觉也是一种生活态度') # 定义对象 liang = Person() # 调用方法 liang.eat() liang.sleep() # 属性时动态添加的 liang.name = '某某某' # 获取属性 print(liang.name)
-
self使用
class Person:
def run(self):
# self表示当前对象:谁调用该方法就表示谁
print(’{}每天以2m/s的速度慢跑5km’.format(self.name))def introduce(self): # 不但可以访问成员属性 print('我叫{}'.format(self.name)) # 还可以调用成员方法 self.run() fei = Person() fei.name = '路人甲' fei.run() fei.introduce() long = Person() long.name = '路人乙' long.introduce()
- 说明:
1.类中的每个成员方法都有一个self参数,调用的时候不需要传递该参数
2.该参数的名字可以不是self,只不过通常我们都使用这个
3.self表示当前对象,对调用该方法self就代表谁,哪个对象调用就表示哪个对象
4.通过self可以访问成员属性,也可以调用成员方法
- 说明:
-
__str__方法
class Person:
# 使用print方法打印对象,默认打印 类名 + 地址
# 若想打印特定内容,重写该方法即可,要求返回一个字符串
def str(self):
return ‘我叫{},今年{}’.format(self.name, self.age)james = Person() james.name = '路人丙' james.age = 33 print(james)
-
构造方法:创建对象后,初始化属性时,系统会自动调用该方法
class Cat:
def str(self):
return ‘name:{},age:{},color:{}’.format(self.name, self.age, self.color)# 构造方法:创建对象后,初始化系统就会自动调用该方法 def __init__(self, name, age, color): print('__init__') self.name = name self.age = age self.color = color # 这种形式比较繁琐 # tom = Cat() # tom.name = 'Tom' # tom.age = 3 # tom.color = '蓝色' # 这种比较简洁 tom = Cat('Tom', 3, '蓝色') print(tom)
-
析构方法:当对象释放时系统会自动调用,通常用于释放资源
class Pig:
# 析构方法:当对象释放时,系统会自动调用
# 若手动使用del删除,则会立即调用该方法
# 该方法一般做资源释放处理:数据库连接断开,文件关闭
def del(self):
print(‘大师兄,我不行了’)bajie = Pig() del bajie print('八戒,一路走好!')
-
示例:小明手里有两张牌,左右♥K,右手♠A,小明交换两手的牌后,手里分别是什么?
-
思路:
- 先找到对象:左手、右手、♥K、♠A、小明
- 根据对象抽象出对应的类:人、手、牌
- 根据需要写出相应的逻辑,很可能反过来完善类的设计
- 按照题目要求创建相关对象,调用相关方法,实现相关功能
-
代码:
对象:小明、左手、右手、♥K、♠A
类:人、手、牌
设计相应的类
扑克牌
class Poker:
def init(self, color, number):
self.color = color
self.number = numberdef __str__(self): return '{}{}'.format(self.color, self.number)
创建两张牌
p1 = Poker(‘♥’, ‘K’)
p2 = Poker(‘♠’, ‘A’)手的类
class Hand:
def init(self, poker):
self.poker = pokerdef hold_poker(self, poker): self.poker = poker
创建左右两只手
-