类属性、实例属性

  1. class Tool(object):
  2. #属性(类属性)类对象(Tool)
  3. num = 0
  4. #方法
  5. def __init__(self,new_name):
  6. self.name = new_name #实例属性
  7. Tool.num += 1 #(类属性的引用方法)
  8.  
  9. tool1 = Tool('铁锹')
  10. tool2 = Tool('工兵铲')
  11. tool3 = Tool('水桶')

实例属性:

和具体的某个实例对象有关系
并且一个实例对象和另一个实例对象是不共享属性的

类属性:

类属性所属于类对象
并且多个实例对象之间共享同一个类属性

类方法、实例方法、静态方法:

  1. class Game(object):
  2.  
  3. #类属性
  4. num = 1
  5.  
  6. #实例方法:必须要有一个参数,参数用来接触对象(self)
  7. def __init__(self):
  8. #实例属性
  9. self.name = 'laowang'
  10.  
  11. #类方法:必须要有一个参数 ,参数进行类的引用
  12. @classmethod
  13. def add_num(cls): #cls:保存类的引用(修改类属性)
  14. cls.num = 100
  15.  
  16. # 静态方法:可以没有任何参数
  17. @staticmethod
  18. def print_menu():
  19. print('---------------')
  20. print('穿越火线')
  21. print('1、开始游戏')
  22. print('2、结束游戏')
  23. print('---------------')
  24.  
  25. #调用类方法
  26. game = Game()
  27. # Game.add_num() #1、调用类方法#可以通过类的名字调用类方法
  28. game = Game() #2、还可以通过这个类创建出来的对象去调用这个类方法
  29. print(Game.num)
  30.  
  31. #调用静态方法
  32. #Game.print_menu() #1、通过类调用静态方法
  33. game.print_menu() #2、通过实例对象去调用静态方法

__new__方法:

  1. class Dog(object):
  2. def __init__(self):
  3. print('-------init方法------')
  4. def __del__(self):
  5. print('-------del方法------')
  6. def __str__(self):
  7. print('-------str方法------')
  8. def __new__(cls): # cls时Dog指向的那个对象
  9. # print(id(cls))
  10. print('-------NEW方法------')
  11. return object.__new__(cls) # 重新调用object类的new方法
  12.  
  13. # print(id(Dog))
  14. xtq = Dog()  

相当于要做3件事
1、调用__new__方法只来创建对象,然后找一个变量来接受__new__的返回值,这个返回值表示创建出来的对象的引用
2、__init__(刚刚创建出来的对象的应用),__init__只负责初始化
3、返回对象的引用

总结:
  · _new__至少要有一个参数cls,代表要实例化的类。
  · __new__必须要有返回值,返回实例化出来的实例。
  · __init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

单例:

1. 单例是什么
  举个常见的单例模式例子,我们日常使用的电脑上都有一个回收站,在整个操作系统中,回收站只能有一个实例,整个系统都使用这个唯一的实例,而且回收站自行提供自己的实例。因此回收站是单例模式的应用。
  确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。

单例:不管创建多少此,都是一个对象。eg:window

  1. class Dog(object):
  2. __instance = None #为了不影响外边,设置成私有属性
  3. def __new__(cls):
  4. if cls.__instance == None:
  5. cls.__instance = object.__new__(cls)
  6. return cls.__instance
  7. else:
  8. #return上一次创建对象的引用
  9. return cls.__instance
  10. a = Dog()
  11. print(id(a))
  12. b = Dog()
  13. print(id(b))
  14. # >>> 1736945052248
  15. # >>> 1736945052248

单例一次

  1. class Dog(object):
  2. __instance = None #为了不影响外边,设置成私有属性
  3. def __new__(cls,name):
  4. if cls.__instance == None:
  5. cls.__instance = object.__new__(cls)
  6. return cls.__instance
  7. else:
  8. #return上一次创建对象的引用
  9. return cls.__instance
  10. def __init__(self,name):
  11. self.name = name
  12.  
  13. a = Dog('旺财')
  14. print(id(a))
  15. print(a.name)
  16.  
  17. b = Dog('哮天犬')
  18. print(id(b))
  19. print(b.name)
  20. # >>> 2605269461816
  21. # >>> 旺财
  22. # >>> 2605269461816
  23. # >>> 哮天犬  

只初始化一次:

  1. #单例:不管创建多少此,都是一个对象。eg:window
  2. class Dog(object):
  3. __instance = None #为了不影响外边,设置成私有属性
  4. __init_flag = False
  5. def __new__(cls,name):
  6. if cls.__instance == None:
  7. cls.__instance = object.__new__(cls)
  8. return cls.__instance
  9. else:
  10. #return上一次创建对象的引用
  11. return cls.__instance
  12. def __init__(self,name):
  13. if Dog.__init_flag == False:
  14. self.name = name
  15. Dog.__init_flag = True
  16.  
  17. a = Dog('旺财')
  18. print(id(a))
  19. print(a.name)
  20.  
  21. b = Dog('哮天犬')
  22. print(id(b))
  23. print(b.name)
  24. # >>> 2605269461816
  25. # >>> 旺财
  26. # >>> 2605269461816
  27. # >>> 旺财

python面向对象<三>的更多相关文章

  1. Python面向对象三要素-继承(Inheritance)

    Python面向对象三要素-继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承概述 1>.基本概念 前面我们学习了Python的面向对象三 ...

  2. Python面向对象三要素-封装(Encapsulation)

    Python面向对象三要素-封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.封装概述 将数据和操作组织到类中,即属性和方法 将数据隐藏起来,给 ...

  3. Python面向对象(三)

    一.绑定方法与非绑定方法 一.绑定方法:绑定给谁就应该由谁来调用,谁来调用就会将谁当作第一个参数传入 1.绑定给对象的方法:类中定义的函数默认就是绑定给对象的 2.绑定给类的方法:为类中定义的函数加上 ...

  4. Python面向对象三要素-多态

    Python面向对象3要素-多态 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.多态概述 OCP原则:多用“继承”,少修改. 继承的用途:在子类上实现对基类的增强,实现多态. ...

  5. Python 面向对象三(转载)

    来源:Mr.Seven www.cnblogs.com/wupeiqi/p/4766801.html 四.类的特殊成员 上文介绍了Python的类成员以及成员修饰符,从而了解到类中有字段.方法和属性三 ...

  6. python 面向对象三 访问权限 下划线 双下划线

    一.双下划线 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问. ...

  7. python 面向对象(三)类与类之间的关系 初始化方法一些类

    ###################总结################# 面试的时候 让写python一些特殊方法 __init__ 创建对象的时候初始化 __new__对象实例化调用第一个方法 ...

  8. python 面向对象(三)--继承和多态

    在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Supe ...

  9. Python 面向对象(三) 魔术方法

    __getitem__ 在对实例或对象使用索引访问时调用,self[key]__dir__ 收集当前模块的信息,包括继承自其它基类(包括object类)的属性和方法 __new 定义如何创建实例__i ...

随机推荐

  1. kettle 利用 HTTP Client 获取猫眼电影API近期上映相关信息,并解析json

    前言 Kettle 除了常规的数据处理之外,还可以模拟发送HTTP client/post ,REST client. 实验背景 这周二老师布置了一项实验: 建立一个转换,实现一个猫眼API热映电影的 ...

  2. 第二章Java内存区域与内存溢出异常

    第二章 Java内存区域与内存溢出异常 一.概述 对与Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每个new操作去写delete/free代码,不容易出现内存泄露和内存溢出问 题, ...

  3. mongoDB4.0数据库

    下载:https://www.mongodb.com/ 安装:略 注意:使用前修改bin目录下配置文件mongodb.cfg,删除最后一行的'mp'字段 1. 启动服务与终止服务 net start ...

  4. 【C语言笔记】#define与typedef的区别

    1.#define define是预处理指令,在编译时不进行任何检查,只进行简单的替换 宏定义的一般形式为: #define 宏名 字符串 这里所说的字符串是一般意义上的字符序列,不要和C语言中的字符 ...

  5. 线程封闭之栈封闭和ThreadLocal

    线程封闭 在多线程的环境中,我们经常使用锁来保证线程的安全,但是对于每个线程都要用的资源使用锁的话那么程序执行的效率就会受到影响,这个时候可以把这些资源变成线程封闭的形式. 1.栈封闭 所谓的栈封闭其 ...

  6. 某PHP发卡系统SQL注入

    源码出自:https://www.0766city.com/yuanma/11217.html 安装好是这样的 审计 发现一处疑似注入的文件 地址:/other/submit.php 看到这个有个带入 ...

  7. 物理机安装Kali Linux + Windows10双系统安装教程

    转自 https://www.linuxidc.com/Linux/2018-08/153429.htm 一.镜像下载: 根据需求下载自己需要的版本 从官网下载kali 2018.2 的安装包:htt ...

  8. 14.Nginx四层负载均衡

    1.七层负载均衡: 根据url 调度不同的集群 url.cheng.com 10.0.0.5 10.0.0.7 /pass 10.0.0.8 /user 1.web01和web02配置 (只不过代码不 ...

  9. 11.Linux用户特殊权限

    1.特殊权限概述 前面我们已经学习过 r(读).w(写). x(执行)这三种普通权限,但是我们在査询系统文件权限时会发现出现了一些其他权限字母,比如: 2.特殊权限SUID set uid 简称sui ...

  10. fullpage.js报如下错的解决办法

    控制台报错:fullPage: Fullpage.js version 3 has changed its license to GPLv3 and it requires a `licenseKey ...