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__)

结果:
{'nickname': '草丛伦1', 'aggressive': 58, 'life_value': 455, 'hobby': [], '12': '123'}

实例化的对象 对类的属性引用

对象首先是引用自身的属性,对象的名称空间中只有自己的属性

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))  # 函数需要传递两个参数
原文地址:https://www.cnblogs.com/Python666/p/6734296.html