python面向对象及命名空间
初识面向对象
一种新的编程思路
一些概念,一些语法
# 面向过程 : 想要一个结果 写代码 实现计算结果
# 面向对象开发 : 有哪些角色 角色的属性和技能 两个角色之间是如何交互的
# 复杂的 拥有开放式结局的程序 比较适合使用面向对象开发
# 游戏
# 购物
- 类和对象之间的关系?
- 类:是一个大范围 是一个模子 它约束了事物有哪些属性 但是不能约束具体的值
- 对象:是一个具体的内容 是模子的产物 它遵循了类的约束 同时给属性赋上具体的值
先来定义模子,用来描述一类事物,具有相同的属性和动作
class Person: # 类名
def __init__(self):
# 必须叫__init__这个名字。不能改变的,所有的在一个具体的人物出现之后拥有的属性
# 都可以写在这里
print('_' * 20)
self.name = 'alex' # 对象的属性/实例变量
self.sex = 'man'
self.job = '搓澡工'
self.level = 0
self.hp = 250
self.weapon = '搓澡巾'
self.ad = 1
print('*' * 20)
alex = Person() # alex 就是对象, alex = Person()的过程 是通过类获取一个对象 - 实例化
wusir = Person()
# 类名加括号会自动调用类中的__init__方法
#Person是一个类:alex,wusir都是这个类的对象
print(alex.__dict__) # {'name': 'alex', 'sex': 'man', 'job': '搓澡工', 'level': 0, 'hp': 250, 'weapon': '搓澡巾', 'ad': 1}
print(alex) # <__main__.Person object at 0x00000167DFE481D0>
把属性写活
class Person: # 类名
def __init__(self,name,sex,job,hp,weapon,ad):
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')
print(alex.__dict__)
print(alex)
wusir = Person('wusir','man','法师',5000,'棍',1000)
print(wusir.__dict__)
print(wusir)
'''
{'name': 'alex', 'sex': '不详', 'job': '搓澡工', 'level': 0, 'hp': 260, 'weapon': '搓澡巾', 'ad': '1'}
<__main__.Person object at 0x00000235605426A0>
{'name': 'wusir', 'sex': 'man', 'job': '法师', 'level': 0, 'hp': 5000, 'weapon': '棍', 'ad': 1000}
<__main__.Person object at 0x0000023560542748>
'''
类有一个空间,存储的是定义在class中的所有名字
每一个对象又拥有自己的空间,通过 对象名.__dict__ 就可以查看这个对象的属性和值
-
属性的查看、修改、增加、删除(增删改查)
class Person: # 类名 def __init__(self,name,sex,job,hp,weapon,ad): self.name = name self.sex = sex self.job = job self.level = 0 self.hp = hp self.weapon = weapon self.ad = ad wusir = Person('wusir','man','法师',5000,'棍',1000) print(wusir.__dict__) #----------查看----------- print(wusir.__dict__['job']) # 简单写法print(wusir.job) #法师 #----------修改----------- wusir.job = '战士' print(wusir.job) #战士 #----------增加----------- wusir.money = 999 print(wusir.__dict__) print(wusir.money) #{'name': 'wusir', 'sex': 'man', 'job': '战士', 'level': 0, 'hp': 5000, 'weapon': '棍', 'ad': 1000, 'money': 999} #999 #----------删除----------- del wusir.money print(wusir.__dict__) #{'name': 'wusir', 'sex': 'man', 'job': '战士', 'level': 0, 'hp': 5000, 'weapon': '棍', 'ad': 1000}
# 实例化所经历的步骤
# 1.类名() 之后的第一个事儿 :开辟一块儿内存空间
# 2.调用 __init__ 把空间的内存地址作为self参数传递到函数内部
# 3.所有的这一个对象需要使用的属性都需要和self关联起来
# 4.执行完init中的逻辑之后,self变量会自动的被返回到调用处(发生实例化的地方)
命名空间问题
对象.func1() == 类名.func1(对象)
class A:
City = '中国' # 静态变量/静态属性,存储在类的命名空间里
def __init__(self): # 绑定方法,存储在类的名称空间里
pass
def func1(self):
pass
def func2(self):
pass
def func3(self):
pass
a = A()
print(A.City)
a.func1() # 相当于 A.func1(a) 对象.func1() == 类名.func1(对象)
- 类中的变量是静态变量
2.对象中的变量只属于对象本身,每个对象有属于自己的空间来存储对象的变量
3.当使用对象名去调用某一个属性的时候会优先在自己的空间中寻找,找不到再去对应的类中寻找
4.如果自己没有就引用类的,如果类也没有就报错
5.对于类来说,类中的变量所有的对象都是可以读取的,并且读取的是同一份变量
- 类中的静态变量的用处
- 如果一个变量是所有对象共享的值,那么这个变量应该被定义成静态变量
- 所有和静态变量相关的增删改查都应该使用类名来处理
- 而不应该使用对象名直接修改静态变量

浙公网安备 33010602011771号