例子
class Person():
role = '角色' #静态变量
def f1(self): # 动态属性 方法(函数) 默认带一个参数self
print(1234567)
引用静态变量
类名.dict[‘静态变量名’] 可以查看,但是不能删改
#print(Person.__dict__) # 内置的双下方法
print(Person.__dict__['静态变量'])
#Person.__dict__['静态变量'] = 456 # 报错
print(Person.__dict__['role'])
类名.静态变量名 直接就可以访问,可以删改
#print(Person.静态变量) # 123 值
print(Person.role)
#Person.静态变量 = 值
Person.role = 'person1'
print(Person.静态变量)
删除一个静态变量 del 类名.静态变量名
del Person.role
引用动态变量
# 1.类名.方法名 查看这个方法的内存地址
# 1.类名.方法名(实参) 调用了这个方法,必须传一个实参,这个实参传给了self
创造一个对象 - 实例化
# 产生一个实例(对象)的过程
# 对象 = 类名()
class Cat:
role = ' Cat' # 静态属性
def __init__(self, name, sex, kind):
self.name = name # 对象属性 = 属性值
self.sex = sex
self.kind = kind
def eat(self):
return '%s 吃了' % (self.name)
def drink(self):
return '%s喝了' % (self.name)
miao = Cat('miao', '女', '波斯猫')
miao.eat()
实例化的过程:
# 1.创造一个实例,将会作为一个实际参数 # python
# 2.自动触发一个__init__的方法,并且把实例以参数的形式传递给__init__方法中的self形参
# 3.执行完__init__方法之后,会将self自动返回给alex
__init__方法 :初始化方法,给一个对象添加一些基础属性的方法,一般情况下是针对self的赋值
对象
# 在类的内部 self是本类的一个对象
# 在类的外部,每一个对象都对应着一个名字,这个对象指向一个对象的内存空间
# 属性的调用:
# 对象名.属性名 第一种调用方法
# 对象名.__dict__['属性名'] 第二种调用方法
# 方法的调用 :
# 类名.方法名(对象名) # 那么方法中的self参数就指向这个对象
# 对象名.方法名() # 这样写 相当于 方法中的self参数直接指向这个对象
对象的交互
class Person:
def __init__(self,name,aggr,life_value):
self.name=name
self.aggr=aggr
self.life_value=life_value
def attack(self,dog): #人可以攻击狗
dog.life_value=dog.life_value-self.aggr
class Dog:
def __init__(self,name,aggr,life_value):
self.name = name
self.aggr = aggr
self.life_value = life_value
def attack(self,egg): #狗也可以攻击人
egg.life_value = egg.life_value - self.aggr
egg = Person('egon',250,1000)
dog = Dog('乐乐',50,2000)
print('狗没攻击前egon的生命值:',dog.life_value) #没攻击前egon的生命值
egg.attack(dog) #让egon去攻击狗乐乐
print('狗攻击后egon的生命值:',dog.life_value) #攻击后egon的生命值
print('egon没攻击前狗的生命值:',egg.life_value) #没攻击前egon的生命值
dog.attack(egg) #让狗去攻击egon
print('egon攻击后狗的生命值:',egg.life_value) #攻击后egon的生命值
人狗大战小程序
面向对象——定义及调用的固定模式
class 类名:
def __init__(self,参数1,参数2):
self.对象的属性1 = 参数1
self.对象的属性2 = 参数2
def 方法名(self):pass
def 方法名2(self):pass
对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西
#类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
#括号里传参数,参数不需要传self,其他与init中的形参一一对应
#结果返回一个对象
对象名.对象的属性1 #查看对象的属性,直接用 对象名.属性名 即可
对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可
类命名空间与对象、实例的命名空间
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
而类有两种属性:静态属性和动态属性
- 静态属性就是直接在类中定义的变量
- 动态属性就是定义在类中的方法
其中类的数据属性是共享给所有对象的,也就是说,静态属性是给所有对象的
类的动态属性是绑定到所有对象的,每个对象都有属于自己的动态属性
创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性
在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类…最后都找不到就抛出异常