python之面向对象编程

例子

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,找不到则去类中找,类也找不到就找父类…最后都找不到就抛出异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值