Python面向对象(三)
类的使用:实例化、属性引用
实例化
g1 = Garen('草丛伦1') # 实例化
g2 = Garen('草丛伦2')
g3 = Garen('草丛伦3')
类的属性:变量和函数
print(Garen.camp)
print(Garen.attack)
print(Garen.dict)
结果:
{'__module__': '__main__', '**camp**': 'Demecia', 'n': 3, '__init__': <function Garen.__init__ at 0x000000000231BB70>, '**attack**': <function Garen.attack at 0x000000000231BBF8>, '__dict__': <attribute '__dict__' of 'Garen' objects>, '__weakref__': <attribute '__weakref__' of 'Garen' objects>, '__doc__': None}
通过print(Garen.__dict__)能输出Garen类的名称空间,是一个字典,当我们进行使用的时候,实际是查找的是字典的key,通过key找相应的值
对类的变量的修改就是对其字典进行的修改:
```python
Garen.camp = '123' # 找到字典的key--camp,修改camp的值为123
Garen.x = '123' # 在字典中新增一组
对象
对象也有一个名称空间(这个名称空间中国只有变量),也是字典形式的,可以通过下面的方式进行新增:
g1.__dict__["12"]='123'
print(g1.__dict__)
结果:
实例化的对象 对类的属性引用
对象首先是引用自身的属性,对象的名称空间中只有自己的属性
print(g1.nickname) #引用自身的属性
print(g1.aggressive)
print(Garen.camp) # 自身没有,引用的是类的属性
类的属性是共享的,多个实例化的对象指向的是同一个变量的地址,是一样的内容,所以说是共享的
print(g1.camp,id(g1.camp)) # 通过id查看内存的地址
print(g2.camp,id(g2.camp))
print(g3.camp,id(g3.camp))
结果是:
Demecia 43096248
Demecia 43096248
Demecia 43096248
对象修改的是在自身的下面添加的,之后查找的时候是从首先从自己的内训寻找的
g1.camp = '1111'
print(g1.camp)
print(g2.camp)
print(g3.camp)
结果:
1111 # 查看的是自己内部的名称空间中的变量
Demecia
Demecia
小练习:对实例化的计数
关键: 每次实例化都会运行__init__,所以在init中写
class Garen: # 下面是类的属性
camp = 'Demecia'
n = 0 # 定义的Garen类的变量,用于实例化次数的计数
def __init__(self,nickname,aggressive=58,life_value=455):
self.nickname = nickname
self.aggressive = aggressive
self.life_value = life_value
Garen.n += 1 # 每次实例化后计数加一,Garen.n
self.hobby = []
def attack(self,enemy):
enemy.life_value -= self.aggressive #
# 实例化
g1 = Garen('草丛伦1') # 实例化
g2 = Garen('草丛伦2')
g3 = Garen('草丛伦3')
print(g1.n) # 两种查看的方法
print(Garen.n)
结果:
3
3
绑定方法和函数
print(g1.attack) # 绑定方法
print(Garen.attack) # 函数
结果:
bound method Garen.attack of <main.Garen object at 0x00000000024546A0>>
**function **Garen.attack at 0x000000000244BBF8>
print(g1.attack(g1)) # 绑定方法使用的时候是把自己g1传递给了self
print(Garen.attack(g1,g1)) # 函数需要传递两个参数