面向对象—基础、名称空间、三大特性
面向对象
-
初识
-
一种新的编程思路
-
面向过程开发:想要一个结果 写代码 实现计算结果
-
面向对象开发:有哪些角色 角色的属性和技能之间是如何交互的
-
-
-
什么时候用?
复杂的 拥有开放式结局的程序 比较适合使用面向对象开发
-
游戏
-
购物
-
-
例子:人狗大战
alex = {
'name': 'alex',
'sex': '不详',
'job': '搓澡工',
'level': 0,
'hp' : 250,
'weapon':'搓澡巾',
'ad' : 1
}
小白 = {
'name':'小白',
'kind':'泰迪',
'hp':5000,
'ad':249
}
# 1.你怎么保证所有的玩家初始化的时候都拥有相同的属性
# 2.每来一个新的玩家,我们都自己手动的创建一个字典,然后向字典中填值
# 3.人物和狗的技能如何去写
# 建立人物的模子:
def Person(name,sex,job,hp,weapon,ad,level=0): # 人模子
def 搓(dog):
dog['hp'] -= dic['ad']
print('%s 攻击了 %s,%s掉了%s点血' % (dic['name'], dog['name'], dog['name'], dic['ad']))
dic = {
'name': name,
'sex': sex,
'job': job,
'level': level,
'hp' :hp,
'weapon':weapon,
'ad' : ad,
'action':搓
}
return dic
# 建立狗的模子:
def Dog(name,kind,hp,ad):
def 舔(person): # 函数不是一个公用的函数 是一个有归属感的函数
person['hp'] -= dic['ad']
print('%s 舔了 %s,%s掉了%s点血' % (dic['name'], person['name'], person['name'], dic['ad']))
dic = {
'name': name,
'kind': kind,
'hp': hp,
'ad': ad,
'action':舔
}
return dic
alex = Person('alex','不详','搓澡工',250,'搓澡巾',1)
wusir = Person('wusir','male','法师',500,'打狗棍',1000)
小白 = Dog('小白','泰迪',5000,249)
小金 = Dog('小金','柯基',10000,499)
小白['action'](alex) # 小白 舔了 alex,alex掉了249点血
alex['action'](小白) # alex 攻击了 小白,小白掉了1点血以上的程序可以用面向对象的方法解决:
class Person: # 类名
def __init__(self,name,sex):
# 必须叫 __init__这个名字,不能改变的,所有的在一个具体的人物出现之后拥有的属性都可以写在这里
self.name = 'alex'
self.sex = 'man'
alex = Person() # alex 就是对象 alex = Person()的过程 是通过类获取一个对象的过程 — 实例化
# 类名()会自动调用类中的__init__方法
class Person: # 类名
def __init__(self,name,sex,job,hp,weapon,ad):
# 必须叫__init__这个名字,不能改变的,所有的在一个具体的人物出现之后拥有的属性
self.name = name
self.sex = sex
self.job = job
self.level = 0
self.hp = hp
self.weapon = weapon
self.ad = ad
alex = Person('alex','不详','搓澡工',260,'搓澡巾',1)
# alex 就是对象 alex = Person()的过程 是通过类获取一个对象的过程 - 实例化
print(alex,alex.__dict__)
# <__main__.Person object at 0x00000224364739B0>
# {'name': 'alex', 'sex': '不详', 'job': '搓澡工', 'level': 0, 'hp': 260, 'weapon': '搓澡巾', 'ad': 1}
wusir = Person('wusir','male','法师',500,'打狗棍',1000)
# print(wusir,wusir.__dict__)
print(alex.name) # print(alex.__dict__['name']) 属性的查看
alex.name = 'alexsb' # 属性的修改
print(alex.name) # alexsb
alex.money = 1000000 # 属性的增加
print(alex.money) # 1000000
print(alex.__dict__)
# {'name': 'alex', 'sex': '不详', 'job': '搓澡工', 'level': 0, 'hp': 260, 'weapon': '搓澡巾', 'ad': 1, 'money': 1000000}
del alex.money # 属性的删除
print(alex.__dict__) -
类和对象之间的关系?
-
类 是一个大范围 是一个模子 它约束了事物有哪些属性 但是不能约束具体的值
-
对象 是一个具体的内容 是模子的产物 它遵循了类的约束 同时给属性附上具体的值
-
Person是一个类 alex,wusir是这个类的对象
-
类有一个空间,存储的是定义在class中的所有名字
-
每一个对象又拥有自己的空间,通过对象名.
__dict__
就可以查看这个对象的属性和值 -
修改列表\字典中的某个值,或者面向对象的某个属性 都不会影响这个对象\字典\列表所在的内存空间
-
-
实例化所经历的步骤
-
实例 = 类名() 类名()之后的第一件事:开辟一块空间
-
首先开辟空间,调用init方法,把开辟的空间地址传递给self参数,调用
__init__
把空间的内存地址作为self参数传递到函数内部 -
init方法中一般完成:把属性的值存储在self的空间里 — 对象的初始化,所有的这一对象需要使用的属性都要和self关联起来
-
self这个地址会作为返回值,返回给“实例”,执行完
__init__
中的逻辑后,self变量会自动的被返回到调用处(发生实例化的地方)
-
-
实例变量:self.名字
二、面向对象中类的成员和命名空间
-
命名空间
-
在类的命名空间里:静态变量、绑定方法
-
在对象的命名空间里:类指针、对象的属性(实例变量)
-
-
调用的习惯
-
类名.静态变量
-
对象.静态变量(对象调用静态变量的时候,不能对变量进行赋值操作 )
-
绑定方法
-
对象.绑定方法() # ==> 类名.绑定方法(对象)
-
对象.实例变量
-
对象
-
-
对象 = 类名()
怎么用
-
类能做什么用:
-
1.实例化对象
-
2.操作静态变量
-
-
什么时候是对类中的变量赋值,或者去使用类中的变量
-
类名.名字 = ‘值’
-
print(类名.名字 )
-
print(对象名.名字 ) # 如果对象本身没有这个名字
-
-
什么时候是对对象中的变量赋值
-
对象.名字 的时候
-
self.名字 的时候
-
-
-
# 例题1
class A:
Country = '中国' # 静态变量/静态属性 存储在类的命名空间里的
def __init__(self,name,age): # 绑定方法 存储在类的命名空间里的
self.name = name
self.age = age
def func1(self):
print(self)
def func2(self):pass
def func3(self):pass
def func4(self):pass
def func5(self):pass
a = A('alex',83)
print(a.name) # alex
print(a.Country) # 中国(先在a的属性的小空间找Country,没有就通过类指针在A类里找Country)
print(A.Country) # 中国
a.func1() # == A.func1(a)
# <__main__.A object at 0x000002171C4F87F0>
# 可以看出,a实例化开辟自己的空间,调用init方法在自己的空间建立name,age变量,所以调用a.name是用自己的,而调用a.Country时,自己内部没有,就用A类的
# 例题2
class A:
Country = '中国' # 静态变量/静态属性 存储在类的命名空间里的
def __init__(self,name,age,country): # 绑定方法 存储在类的命名空间里的
self.name = name
self.age = age
self.Country = country
def func1(self):
print(self)
def func2(self):pass
def func3(self):pass
def func4(self):pass
def func5(self):pass
a = A('alex',83,'印度')
print(a.name) # alex
print(a.Country) # 印度
print(A.Country) # 中国
# 可以看出,a的空间里有name,Country,都用自己的
# 例题3
class A:
Country = '中国' # 静态变量/静态属性 存储在类的命名空间里的
def __init__(self,name,age,country): # 绑定方法 存储在类的命名空间里的
self.name = name
self.age = age
self.country = country
def func1(self):
print(self)
def func2(self):pass
def func3(self):pass
def func4(self):pass
def func5(self):pass
a = A('alex',83,'印度')
b = A('wusir',74,'泰国人')