class Person: # 注意class 与 def 的不同 $$$ Person——》类名
country = 'China' # 创造了一个只要是这个类就一定有的属性
# 叫做类属性 也称静态属性 不会随对象的创建而改变
def __init__(self,*args): # __init__ --》初始化方法 self是对象,是一个必须传的参数
print(self.__dict__) # self就是一个可以储存很多属性的大字典
self.name = args[0] # 只不过与def语法相比往字典里添加属性的方式发生了一些变化
self.hp = args[1]
self.aggr = args[2]
self.sex = args[3]
print(self.__dict__)
print(id(self))
# 现在self里只有属性,下面再定义方法
def walk(self,n): # self可以改成其他名称的参数,它只是一个局域变量名,结果是不变的
# 若函数写到class里,就成了方法,一般情况下必须传self参数,且必须写在第一个
print('走走走')
print('%s走走走,走了%s步' % (self.name,n))
print(Person.country) # 类名 可以查看类中的属性,不需要实例化就可以查看
alex = Person('狗剩儿',100,1,'不详') # '狗剩儿',100,1,'不详' 赋给*args $$$$ 实例化:调用类,然后拿到对象alex的过程
#
print(alex.__dict__) # 证明self就是alex ,alex 和 self 其实一样,是字典
print(id(alex)) # self 和 slex 的ID 一样
print(alex.name) # 查看属性值
print(Person.__dict__) # 发现有刚刚再Person类下定义的walk方法 并用它查看所有属性
print(Person.__dict__['country'])
print(alex.__dict__)
alex.__dict__['name'] = '二哥'
print(alex.__dict__)
print(alex.name)
alex.name = '二哥'
print(alex.name)
Person.walk(alex,5) # 调用方法 类名.方法名(对象名称)
alex.walk(5) # alex.walk = Person.walk(alex) 即 对象.方法名()
# 对象 = 类名()
# 过程:
# 类名Person(),首先会创造一个alex对象 ,创建了一个self变量(创建class时,就已经有self了)
# 调用init方法,类名括号里的参数会被这里的*args接受
# 执行init方法
# 返回self给对象alex,而不用return ,--》def 与 class 的不同
# 对象能做的事:
# 查看属性
# 调用方法
# __dict__ 对于对象的增删改查操作都可以通过字典的语法,但最好还是通过属性修改,如alex.name = '二哥'
# 类名能做的事:
# 实例化
# 调用方法
# __dict__ 对于类中的名字只能看不能操作