类属性、实例属性

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

实例属性:

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

类属性:

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

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

class Game(object):

    #类属性
num = 1 #实例方法:必须要有一个参数,参数用来接触对象(self)
def __init__(self):
#实例属性
self.name = 'laowang' #类方法:必须要有一个参数 ,参数进行类的引用
@classmethod
def add_num(cls): #cls:保存类的引用(修改类属性)
cls.num = 100 # 静态方法:可以没有任何参数
@staticmethod
def print_menu():
print('---------------')
print('穿越火线')
print('1、开始游戏')
print('2、结束游戏')
print('---------------') #调用类方法
game = Game()
# Game.add_num() #1、调用类方法#可以通过类的名字调用类方法
game = Game() #2、还可以通过这个类创建出来的对象去调用这个类方法
print(Game.num) #调用静态方法
#Game.print_menu() #1、通过类调用静态方法
game.print_menu() #2、通过实例对象去调用静态方法

__new__方法:

class Dog(object):
def __init__(self):
print('-------init方法------')
def __del__(self):
print('-------del方法------')
def __str__(self):
print('-------str方法------')
def __new__(cls): # cls时Dog指向的那个对象
# print(id(cls))
print('-------NEW方法------')
return object.__new__(cls) # 重新调用object类的new方法 # print(id(Dog))
xtq = Dog()  

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

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

单例:

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

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

class Dog(object):
__instance = None #为了不影响外边,设置成私有属性
def __new__(cls):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
#return上一次创建对象的引用
return cls.__instance
a = Dog()
print(id(a))
b = Dog()
print(id(b))
# >>> 1736945052248
# >>> 1736945052248

单例一次

class Dog(object):
__instance = None #为了不影响外边,设置成私有属性
def __new__(cls,name):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
#return上一次创建对象的引用
return cls.__instance
def __init__(self,name):
self.name = name a = Dog('旺财')
print(id(a))
print(a.name) b = Dog('哮天犬')
print(id(b))
print(b.name)
# >>> 2605269461816
# >>> 旺财
# >>> 2605269461816
# >>> 哮天犬  

只初始化一次:

#单例:不管创建多少此,都是一个对象。eg:window
class Dog(object):
__instance = None #为了不影响外边,设置成私有属性
__init_flag = False
def __new__(cls,name):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
#return上一次创建对象的引用
return cls.__instance
def __init__(self,name):
if Dog.__init_flag == False:
self.name = name
Dog.__init_flag = True a = Dog('旺财')
print(id(a))
print(a.name) b = Dog('哮天犬')
print(id(b))
print(b.name)
# >>> 2605269461816
# >>> 旺财
# >>> 2605269461816
# >>> 旺财

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. unittest中HTMLTestRunner模块生成

    unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTestRunner 一.导入HTMLTestRunner 方法1.这个模块下载不能通过pip安装了,只能下载后手动 ...

  2. Windows API 编程入门

    Windows 工作原理的中心思想就是“动态链接”概念.Windows 自身带有一大套函数,应用程序就是通过调用这些函数 来实现它的用户界面和在屏幕上显示文本和图形的.这些函数都是在动态链接库里实现的 ...

  3. Windows常用操作

    目录 查询IP地址 常用快捷键 显示文件后缀名 查询IP地址 1.进入到dos界面 2.输入命令: ipconfig 常用快捷键 快捷键 作用 win+E 打开计算机 win+R 打开运行 win+R ...

  4. shark恒破解笔记2-绕过自校验

    这集讲的是绕过自校验 主要是通过文件大小的自校验 首先查壳 有壳  可以用esp定律搞定 OD载入  右键od脱裤壳调试进程 可以看到一些信息 包括入口点252F0 修正后地址为252F0 loadP ...

  5. MySQL 分页查询优化——延迟关联优化

    目录 1.   InnoDB表的索引的几个概念 2.   覆盖索引和回表 3.   分页查询 4.   延迟关联优化 写在前面 下面的介绍均是在选用MySQL数据库和Innodb引擎的基础开展.我们先 ...

  6. C#扩展一般用于linq

    下面是dictionary的扩展 using System.Collections.Generic; namespace NetAnalysis.Common { public static clas ...

  7. SpringCloud学习--Eureka 服务注册与发现

    目录 一:构建项目 二:服务注册与发现 为什么选择Eureka,请看上一篇博客 Eureka -- 浅谈Eureka 项目构建 IDEA 选择 New Project 选择 Spring Initia ...

  8. 设计模式(四)Factory Method模式

    简单来说,用Template Method模式来构建生成实例的工厂,就是Factory Method模式.在这个模式中,父类决定实例的生成方式,但不决定所要生成的具体的类,具体的处理全部交给子类负责. ...

  9. Python+requests+unittest+excel实现接口自动化测试框架(摘录)

    一.框架结构:  工程目录 二.Case文件设计 三.基础包 base 3.1 封装get/post请求(runmethon.py) 1 import requests 2 import json 3 ...

  10. Windows 10 中CPU虚拟化已开启,但是docker无法运行

    在管理员模式下的PowerShell中执行: bcdedit /set hypervisorlaunchtype Auto 然后重启电脑即可