初识面向对象----类和对象的关系
以前我们学习的是面向过程的变成 就是只看结果不看过程 ,那样一步一步来做的东西就太多了 其实我们完全可以避免所有的重复的,比如你要取配备一个电脑这个时候你怎么办呢?按照我们以前所学的就是一步一步做,然而运用了面向对象就是直接去中关村大街然后找一家配备电脑的商铺去告诉他你要买什么需求的电脑就可以了 不用事事亲为。
也好比项目经理给你们分配任务 他只需要告诉你他的需求就可以了 不需要知道你是怎么执行的,告诉你们每个人它的需要最后把所有的结果拿来就可以了,并且如果你们是三个人 那么其中一个人的错误并不能让结果崩溃 只需要对错误的那个人的工作进行修改就可以,并不需要全部的人都返工重做,就是一个方法出错只对这一个方法进行修改并不需要全部都修改
看看面向过程的人狗大战:
#首先我们来设计一个简易的游戏的模式 让人狗大战 #定义一个人的函数 def Person(name, sex, hp, ad):#传递进来人的名字 性别 血 攻击力 # 定义一个字典用来接收他们的信息 self = {'name':name, 'sex':sex, 'hp':hp, 'ad':ad} def attack(dog): #运用闭包是为了让最外围的函数结束之后不至于会把这个函数关闭 print('{}攻击{}'.format(self['name'],dog['name'])) dog['hp'] -= self['ad'] self['attack'] = attack return self #定义一个狗的类 def Dog(name, sex, hp, ad): self = {'name':name, 'sex':sex, 'hp':hp, 'ad':ad} def attack2(person): print(''.format(self['name'], person['name'])) person['hp'] -=Dog['ad'] self['attack2'] = attack2 return self m =Person('alex', '男', 100,30) n = Dog('老王', '女', 50, 60) m['attack'](n) #让alex去攻击老王 print(n['hp']) #老王剩余的血
面向对象编程:
对象是由类创建而来的 同一个类创建的不同的对象在内存中的地址不同 所有的属性可单独修改
类的概念:具有相同属性的一类事物
对象:就是对这一个类的具体的描述
比如人类就是抽象的就是类 而小明就是对象 对人这个类的具体的描述
使用面向对象的好处:
使代码之间的关系更加明确
增强代码的可拓展性
规范了对象的属性和技能
面向对象的特点:结局的不确定性:就是比如你有很多的结果你不能一一预测出来 而面向过程你没预测到的就会报错直接pass (虽然我也不太懂)
类的定义:
class 类名:
属性
方法
对象的建立是由类来生成的所以我们想要建立对象是由类而来的
对象名=类名()
查看你类中点定义的变量的信息:用__dict__方法 并且你查看总信息是以字典的形式来显示的 类用dict方法查看的是它的属性,也就是类的全局变量的
class Person:
#类是由静态属性和方法来组成的
s = 'nihao'
静态变量 = 678
def func(self):
pass
# 第一种查找的方式
# print(Person.__dict__) #查看总的变量信息
# print(Person.__dict__['s']) #指定变量名去查找
# print(Person.__dict__['静态变量']) #指定查找
# 第二种的查找方式
print(Person.s)
print(Person.静态变量)
Person.静态变量 = 123 #修改类中的变量的信息
print(Person.静态变量)
#也可以用del来删除类中的变量
del Person.静态变量 #删除
dict方法还可以用来查看对象的属性的变量信息
class Person(object) : role = 'person' #静态属性 #方法 def __init__(self, name ,sex, hp, ad): #self方法是自带的它是对象的初始化就是在最想创建的同时去执行它里面的内容 self.name = name self.sex = sex self.hp = hp self.ad = ad def attack(self): print('%s发起了一次攻击'%self.name) alex = Person('sb', '不详', 1, 5) 老王 = Person('老王', '女', 20, 50) print(alex.__dict__) #因为你把所有的信息已经传递给了 init了所以你现在就是查看init方法中的对象的信息 是以字典的形式存在 print(alex.name) #因为你这个时候的alex就是init内的self所以alex.name == self.name
alex.name = '大帅哥' #更改对象的名字
print(alex.name)
类就是好比一个大模子 而对象是根据这个类来创建的 就是每创建一个对象就在内存中开辟一个不同的地址来存储这个对象
所以我们可以用__dict__方法来修改对象所对应的属性但是不能修改类中的属性 因为类是总的信息 不可以被修改
就是你可以用类调用__dict__方法来实现你想查看的所有类的变量属性,而不能直接用来修改 ,但是对象就可以 因为对象是在内存中单独开辟的一个 内存空间和总类无关
alex.__dict__['name'] = 'bajk' print(alex.__dict__) print(Person.__dict__) Person.__dict__['role'] = '123' #这是错误的不能去修改总的信息 你可以去修改自己创建的对象内的变量不可以直接对类进行修改 print(Person.__dict__) #报错 alex.__dict__['role'] = '123' print(alex.__dict__['role'])
实例化过程:
1 :创造一个实例将会作为一个实际参数
2: 自动触发__init__方法 并且把实例传递给__init__方法中的self参数
3:执行完__init__方法之后,会将self自动返回给实例
对象:
在类的内部self是本类的一个对象(只限init方法)
在类的外部,每一个对象都对应着一个名字 这个对象指向一个对象的内存空间 (就是不同的对象指向不同的空间)
属性的调用:
对象名.属性 #第一种调用方法
对象名.__dic__['属性名'] #第二种调用方法
方法的调用 :
类名.方法名(对象名) # 那么方法中的self参数就指向这个对象
对象名.方法名() # 这样写 相当于 方法中的self参数直接指向这个对象