• python『学习之路03』面向对象


    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time : 2017/11/21 18:48
    # @Author : mixiu26

    class Role(object):
    n=123 # 类变量
    def __init__(self,name,role,weapon,life_value = 100,money = 15000):
    # 类执行前先执行__init()__方法
    # __init__() ----- >> 数据初始化:用于数据初始化赋值 self --- >> 相当于java中的this . this.name = name的意思,谁调用构造,self就相当于是谁
    # ----- >> 构造函数
    # ----- >> 在创建对象时完成数据初始化.
    self.name = name # ---- >> 成员变量 ---- >> 静态属性
    self.role = role
    self.weapon = weapon
    # self.life_value = life_value
    self.__life_value = life_value # 将成员变量设置为私有属性,对外提供公共访问方法,在变量前加上双下划线即可
    self.money = money

    def shot(self): # ----- >> 类的方法 ---- >> 动态属性
    print("shotting..........")

    def __got_shot(self): # 成员方法私有,对外提供公共访问方法function()
    # 在本类中可修改私有成员属性值
    self.__life_value -= 20
    print("%s 被打中了....." %self.name)

    def buy_gun(self,gun_name):
    print("%s just bought %s" %(self.name, gun_name))
    # 对外提供公共访问方法
    def show(self):
    print("%s生命值仅剩: %s" % (self.name,self.__life_value))

    def function(self):
    self.__got_shot()

    # 析构函数 ---- >> 在实例释放,准备销毁时候执行,通常用于一些收尾处理,关闭内存空间,关闭数据库连接,关闭打开的临时文件
    # 格式: def __del__(self):
    # def __del__(self): # 实例释放时自动执行,不接收任何参数:
    # print("%s 实例释放: " % self.name)

    r1 = Role('mixiu26','police','AK46') # 创建角色 ---- >> 实例化 ---- >> 初始化类 ---- >> 创建对象
    # # 实例化: ---- >> 把一个类变成一个具体对象的过程,称为实例化
    r2 = Role('hzh31','terrorlist','B22') # ---- >> 实例变量,作用域是实例本身 --- >>Role的实例
    # r1.buy_gun('AK46')
    # r2.buy_gun('B22')
    # r1.got_shot() AttributeError: 'Role' object has no attribute 'got_shot'
    # r2.got_shot() AttributeError: 'Role' object has no attribute 'got_shot'
    r1.function()
    r2.function()
    r1.show()
    r2.show()

    # print(r1.self.__life_value) AttributeError: 'Role' object has no attribute 'self'

    # ---- >> 其实就相当于在栈中申请了空间,其实相当于在__iniy()__方法中申请了空间 r2, 然后Role(),其实就是相当与在堆内存开辟了一个空间
    # ---- >> Role就相当于对数据进行初始化,name = null ,role = null,weapon = null, 其实还有方法区的初始化,然后Role中的方法区就有一个内存地址
    # ---- >> Role()时就把Role中方法区的地址给了Role(), 然后就在二者间产生了关联,所以将来这里产生的对象就能通过这个地址值去找到Role中的成员方法
    # ---- >> 这之后Role()方法的初始化就完成了,完成后Role()方法本身也获得了一个地址值,然后就把这个地址值给了r1,r1就通过这个地址值指向了Role()
    # ---- >> 那self呢?其实Role() 他自己就是self,整个Role()对象就是this,所以这次访问的对象是r1,那么self就相当于r1了
    # ---- >> r1.buy_gun(),就会找到方法区中的buy_gun()方法,有就不报错,然后把方法加载到栈内存,而我们现在是通过r1来调用,所以
    # ---- >> 此刻的self代表的就是r1 ,所以在__inin()__ 方法中self.name = name ---- >>就相当于是r1.name = name,所以就相当于把
    # ---- >> r1中的'mixiu26'给了name, 把police给了role

    # print(r1.n,r1.name) # 123 mixiu26
    # print(r2.n,r2.name) # 123 hzh31
    #
    # # 修改变量值:
    # r1.name = "neinei"
    # r2.name = "paofu"
    #
    # print(r1.n,r1.name) # 123 neinei
    # print(r2.n,r2.name) # 123 paofu

    # 为r1添加属性值:
    # r1.dream = "good girl"
    # print(r1.n,r1.name,r1.dream) # 123 neinei good girl ==== >> 其实这里有隐含的(r1,r1.n,r1.name,r1.dream)
    #
    # # 删除成员属性值:
    # del r1.dream
    # # print(r1.n,r1.name,r1.dream) # AttributeError: 'Role' object has no attribute 'dream'
    #
    # # 修改类变量的值:
    # r1.n = "789"
    # print(r1.n,r1.name) # 789 neinei 注意,这里说的修改类变量的值,其实是把n= xxx复制到了实例变量中, 然后实例变量再去修改n时,其实这个n和类变量的n已经
    # # 不是同一个n了,所以我们在怎么修改n都是修改实例变量里的,和成员变量n是没有关系的,所以看到的结果是,r1打印了修改后的值,r2中还是成员变量值
    # print(r2.n,r2.name) # 123 paofu

    # 修改成员变量n: 注意,变量的读取遵循就近原则,在前面过程中,我们调用实例变量r1修改成员变量n,我们知道他的原理是把n=xxx,复制了一份到实例变量r1中
    # 所以当Role在取修改n的值时,r1是不会受影响的,因为它读取的是自己实例变量中的n,你成员变量的n在怎么变,对我实例变量来说都没有任何影响,而r2中没有这个实例变量
    # 所以读取的还是成员变量中的n,所以当成员变量的值发生改变后,r2.n 也发生了改变

    # Role.n = "ABC"
    # print(r1.n,r1.name) # 789 neinei
    # # del r1 # neinei 实例释放: 变量消失时会自动执行析构函数回收内存空间,对象不消失,则会等到程序执行完成退出时,回收所有内存空间时执行这个方法
    # print(r2.n,r2.name) # ABC paofu

    # 类变量 --- >> 公有属性,节省内存空间
    # 构造函数 --- >> 创建对象时完成数据初始化:



  • 相关阅读:
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.fileupload.RequestContext
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtils
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.io.FileUtils
    Caused by: java.lang.ClassNotFoundException: javassist.ClassPool
    Caused by: java.lang.ClassNotFoundException: ognl.PropertyAccessor
    利用DBLINK同步表数据库--老刘
    100万并发连接服务器笔记之1M并发连接目标达成
    模拟row cache lock
    redis读写性能测试
    Adobe RIA 开发工程师认证考试大纲
  • 原文地址:https://www.cnblogs.com/mixiu26/p/7875239.html
Copyright © 2020-2023  润新知