【0826 | Day 23】面向对象/类与对象/产生对象/一切皆对象
面向对象
一、面向过程编程 vs 面向对象编程
面向过程编程:
- 优点:流程化
- 缺点:可扩展性差
面向对象编程:
- 优点:可扩展性高
- 缺点: 编写复杂
类与对象
一、基本介绍
对象:属性/方法的结合体
类:一系列共同的属性和方法(用驼峰体表示)
注意:在程序中,先类后对象,属性用变量表示,方法用函数表示。
#生成对象:类加括号生成对象
class Student()
#赋变量名
stu1 = Student()
stu2 = Student()
#获取属性和方法:通过'.'获取
print(stu1.school)
print(stu2.choose) #绑定方法
#查看类中的属性和方法
print(Student.__dict__) #属性和方法丢进字典
print(Student.__dict__['school']) #打印oldboy
print(Student.__dict__['choose']) #打印内存地址
Student.choose(123) #类调用加参数
二、两者区别
---> 类
- 获取类的属性和方法
- 通过
类.__dict__()
获取
- 通过
- 类来调用属性和方法
- 通过
dict[' ']
获取 (但比较复杂) - 通过
类名.属性和函数
获取(传参)(对于类来说,study / choose只是函数)
- 通过
注意:打印结果为function。
---> 对象
- 获取对象的属性和方法
- 通过
对象.__dict__
获取 (空字典)
- 通过
- 对象来调用属性和方法
- 通过
对象.属性/方法
获取(不传参)(对于对象来说,study/choose是方法)
- 通过
注意:打印结果为method。
- 对象自己的属性和方法
stu1.Student()
stu1.name = 'nick'
stu1.school = 'oldgirl' #若类要修改Student.school = 'xxx'
print(stu1.__dict__)
#{'name': nick, 'school': oldgirl}
-
向对象中添加属性
-
stu1.Student()
stu1.name = 'nick' -
__init__
方法class Student: School = 'oldboy' def __init__(self,name): self.name = name
注意:在对象实例化产生对象时,第一个参数不传参
-
-
属性查找顺序
- 对象 ---> 类 ---> 没有就报错,例如print(stu1.oldboy)
-
产生对象
stu1.Student('nick') stu2.Student('jason')
-
绑定方法
- 定义在类内部的方法
- 如果类调用,就是一个普通函数;如果对象调用,叫对象的绑定方法,第一个参数不需要传入,自动传入
一切皆对象
#类实例化产生对象3
Q = [1, 2, 3]
list.append(Q,5) #list是类,传两个参数
Q = list([1, 2, 3])
Q.append(5) #Q是具体对象,传一个参数
人狗大战
#人狗大战
#定义一个狗类
class Dog:
type_dog='金毛'
def __init__(self, name, aggr, hp=100):
self.name=name
self.aggr = aggr
self.hp=hp
def bite(self, target):
#当期狗的攻击力:self.aggr
#人的血量:target.hp
target.hp-=self.aggr
print('''
狗的品种:%s
%s狗咬了一下%s人,
人掉血:%s
人的血量剩余:%s
'''%(self.type_dog,self.name,target.name, self.aggr,target.hp))
#人类
class Human:
def __init__(self,name,aggr,hp=100):
self.name=name
self.aggr=aggr
self.hp=hp
def bite(self,target):
target.hp-=self.aggr
print('''
%s人咬了一下%s狗,
狗掉血:%s
狗的血量剩余:%s
'''%(self.name,target.name,self.aggr,target.hp))
#实例化产生狗对象
# dog1=Dog('旺财',10)
dog1=Dog('旺旺财',10,200)
nick=Human('nick',50)
dog1.bite(nick)
print(nick.hp)
dog1.bite(nick)
print(nick.hp)
nick.bite(dog1)