1. class Role(object):
    n = 123 # 类变量,像__init__中life_value,money默认参数用类变量,如果多个类的实例那就节省了内存,类变量只在类中存一份,实例中不存
    name = "我是类name"
    n_list = []
    def __init__(self, name, role, weapon, life_value=100, money=15000): #初始化方法(或构造方法);在生成一个角色时要初始化的一些属性就填写在这里;
    #这些name,role,weapon,life_value,money属性都是全局的;
    self.name = name
    self.role = role
    self.weapon = weapon
    self.money_1 = money #实例调用时根据selef.xxx调用,即 r1.money_1,一般属性名称与参数名一致
    self.__life_value = life_value #私有属性__life_value,只能在类中调用,实例不可以调用,__life_value存储在实例中,Python解释器把私有属性的名称改变了
  2.  
  3. def __del__(self): #析构函数,实例被释放的时候自动调用
    print("%s 彻底死了。。。。" %self.name)
  4.  
  5. def show_status(self): #获取属性含私有属性的方法
    print("name:%s weapon:%s life_val:%s" % (self.name,self.weapon,self.__life_value))
  6.  
  7. def __shot(self): #私有方法
    print("shooting...")
  8.  
  9. def got_shot(self): #更改私有属性的方法
    self.__life_value -= 50
    print("ah...,I got shot...")
  10.  
  11. def buy_gun(self, gun_name):
    print("just bought %s" % gun_name)
  12.  
  13. r1 = Role('Alex', 'police', 'AK47') #实例化为一个实例r1(生成一个对象r1);会自动把参数传给Role下面的__init__(...)方法;
    #申请了一个块内存命名为r1(也就是r1指向一个内存地址),把r1的地址和赋值的参数传给Role,调用Role的__init__的方法,
    #r1的内存中存放的是r1.name='Alex',r1.role='police',r1.weapon='AK47', r1.life_value=100, r1.money_1=15000 这些属性
    r1.name = "ABC" #更改r1实例中r1.name的值;r1的内存中,生成一块新的内存,存放字符串ABC ,r1.name 指向这块内存;不是类变量name是r1实例的name
    r1.n_list.append("from r1") #调用的是Role类n_list变量的内存
    r1.bullet_prove = True #r1实例增加一个属性
    r1.n = "改类变量" #实例r1中新增一个n的变量;虽然Role类中有n变量;
    #调用的时候,先调用实例有的变量,实例没有才调用类的变量;
    print("r1:", r1.weapon, r1.n)
  14.  
  15. r1. __del__() #直接调用析构函数,不会释放r1实例
  16.  
  17. r1.got_shot()
    # r1.__shot() #不能调用私有方法
    r1.show_status()
  18.  
  19. del r1.weapon #删除r1.weapon这个属性
  1. print(r1._Role__life_value)
    #不能直接访问__life_value是因为Python解释器对外把__life_value变量改成了_Role__life_value,所以,仍然可以通过_Role__life_value来访问__life_value变量
    #但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__life_value改成不同的变量名。
  1.  
  2. r2 = Role('Jack', 'terrorist', 'B22')
  1. r2.n_list.append("from r2")#调用的是Rolen_list变量的内存
  1. self说明:
    classself 类似于下面代码test_self函数中的变量a
  1. def test_self (a,name):
    a.name = name
    print(a.name) #作用域是局部的
  2.  
  3. def cc ():
    pass
    print(id(cc)) #打印cc函数的地址
    cc = test_self(cc,'alex')
    # print(cc.name) #报错没有属性name,因为作用域是局部的
    print(id(cc))#打印cc变量的地址,和上面cc函数的地址不同
  4.  
  1. class Role(object):
    def __init__(this,name,age):
    this.name = name
    this.age = age
    #把self 名称写成什么都可以,只是一个参数名称,实际传递进去的都是实例;一般惯例是写成self,所有默认用self就好了;
  2.  
  3. A = Role('alex',22)
    print(A.name)
  1.  
  2. 和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,并且,调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别,所以,你仍然可以用默认参数、可变参数、关键字参数和命名关键字参数。
  3.  
  4. 私有属性说明:

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问.
需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的设置私有变量名(属性名)。

  1. 析构方法:
    析构方法类默认就有的只是什么都没有做,写__del__等于重构了析构方法;
  2.  
  3. 面向对象与面向过程区别:
    面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
  4.  
  5. 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
  6.  
  7. 例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤29、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。
  8.  
  9. 而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为 1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的i变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
  10.  
  11. 可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
  12.  
  13. 功能上的统一保证了面向对象设计的可扩展性。比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。
  14.  
  15. 再比如我要把这个五子棋游戏改为围棋游戏,如果你是面向过程设计,那么五子棋的规则就分布在了你的程序的每一个角落,要改动还不如重写。但是如果你当初就是面向对象的设计,那么你只用改动规则对象就可以了,五子棋和围棋的区别不就是规则吗?(当然棋盘大小好像也不一样,但是你会觉得这是一个难题吗?直接在棋盘对象中进行一番小改动就可以了。)而下棋的大致步骤从面向对象的角度来看没有任何变化。
  16.  
  17. 当然,要达到改动只是局部的需要设计的人有足够的经验,使用对象不能保证你的程序就是面向对象,初学者或者很蹩脚的程序员很可能以面向对象之虚而行面向过程之实,这样设计出来的所谓面向对象的程序很难有良好的可移植性可扩展性
  18.  
  19. 参考:
    https://www.cnblogs.com/alex3714/articles/5188179.html
    https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318650247930b1b21d7d3c64fe38c4b5a80d4469ad7000
  20.  
  21. 面向对象与面向过程区别参考:
    https://zhidao.baidu.com/question/2089034.html

calss 类的更多相关文章

  1. MyBatis学习笔记(三) Configuration类

    一.初探Configuration类 我们先来看一下MyBatis的XML配置文件的结构,(摘自mybatis.org) 下面这个是Configuration类的部分变量 一点不一样是不是??? 其实 ...

  2. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  3. C# 泛型约束

    一.泛型简介1.1泛型通过使用泛型,可以创建这样的类.接口和方法,它们以一种类型安全的工作方式操作各种数据.本质上,术语“泛型”指的是“参数化类型”(parameterized types).参数化类 ...

  4. 层叠样式表(CSS)

    层叠样式表(CSS) CSS(Cascading Style Sheet)中文译为层叠样式表.是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言.CSS的引入就是为了使得HTML语言能够 ...

  5. C与C++的区别无随时更新

    C没有calss类,只有结构体struct class A;  在C中这样写就是错误的,C没有关键字class C的字符指针不会自动开辟内存空间,必须对这个指针指向的地址手动开辟空间后才可以写入数据. ...

  6. 瀑布流布局--原生JavaScript

    HTML(注意包裹关系,方便js调用) <body> <div id="main"> <div class="box"> & ...

  7. .NET基础之自定义泛型

    在.NET中泛型使用非常频繁,在控制台应用程序中,默认的引入了System.Collection.Generics名称空间,其中就提供了我们经常使用的泛型:List<T>和Dictiona ...

  8. 疯狂java讲义--笔记

    第一章.Java语言概述与开发环境 什么是软件:一系列按照特定顺序组织的计算机数据和指令的集合: 交互方式:两种 GUI(Graphical User Interface) 图像界面 .CLI (Co ...

  9. java反射简解

    1.首先一个问题,什么是类,类是不是对象? 我们总是说我们new一个对象出来 那么我们还没有new的时候,建造的那个java类是不是对象呢? 是 它是java.lang.Class的对象 对于反射我们 ...

随机推荐

  1. Petrozavodsk Winter-2018. Jagiellonian U Contest

    A. XOR 求出所有数的异或和$sum$,将所有数and上$sum$,然后求线性基,则选取$sum$的所有$1$对应的基最优. 时间复杂度$O(n\log x)$. #include<cstd ...

  2. World Finals 2018 感想

    垃圾比赛卡我读入卡我输出毁我青春.

  3. H5页面测试实战总结

    如何判断是否是H5页面: 基本上只要对那个view长按,然后看是不是有反应,比如手机震动(Android).或者出现文字选择粘贴(Android/iOS),那么就是WebView! 横屏竖屏相互切换, ...

  4. 输入、输出与Mad Libs 游戏

    name1=input('请输入一个名字:') name2=input('再输入一个名字:') time1=input('请输入一段时间:') print('{},是傻子,{},{}找不到小栗旬'.f ...

  5. page1201未完成

    import java.util.Scanner; /** * @author:李柏宏(LiberHome) * @date:Created in 2019/3/4 20:37 * @descript ...

  6. String对象方法属性总结

    常用属性: constructor;length;prototype;(不在解释): 常用方法: charAt(index);返回指定位置的字符. concat(stringX);连接字符串. ind ...

  7. AS中jar包和aar包区别及导入导出

    发布时间:2018-01-18 来源:网络 上传者:用户 关键字: 导出 导入 区别 包和 aar jar 发表文章 摘要:jar包和aar包区别*.jar:只包含class文件与清单文件,不包含资源 ...

  8. Thymeleaf常用th标签

    https://www.jianshu.com/p/f9ebd23e8da4 关键字 功能介绍 案例 th:id 替换id <input th:id="'xxx' + ${collec ...

  9. java_基础_static{}语句块

    static{}语句块会在类被加载的时候当且仅当执行一次,一般用于初始化变量和调用静态方法 Class.forName(“类名”);方法执行时会加载类 外界调用类中静态变量是不会加载类的,也就是说,如 ...

  10. SVN 服务器端权限管理

    创建用户 点击菜单上的Users可以在右侧窗口区域中看见已经创建的用户 创建组 同样也可以修改组:  分配权限 示例一:开发人员拥有读写权限(组权限) 进入权限分配界面: 添加组或用户: 在添加页面可 ...