类属性、实例属性

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. 【NOIP2013】花匠

    Description 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较 ...

  2. SQL SERVER数据库,按年、月、日、时、分、秒计算两个时间字段之间的间隔时间样例

    使用DATEDIFF(取值,时间字段1,时间字段2) 举例: SELECT DATEDIFF(YEAR,DRYSJ,DCYSJ),* FROM YXHIS2019..TBZYBR2019 --SQL ...

  3. mac 下修改 jenkins 端口以及Jenkins的启动、关闭与更新

    安装包安装的Jenkins修改默认端口的方法: 先关闭jenkins ; 命令行下修改端口:sudo defaults write /Library/Preferences/org.jenkins-c ...

  4. VPGAME 的 Kubernetes 迁移实践

    作者 | 伍冲斌  VPGAME 运维开发工程师 导读:VPGAME 是集赛事运营.媒体资讯.大数据分析.玩家社群.游戏周边等为一体的综合电竞服务平台.总部位于中国杭州,在上海和美国西雅图分别设立了电 ...

  5. 比较两个文件的异同Python3 标准库difflib 实现

    比较两个文件的异同Python3 标准库difflib 实现 对于要比较两个文件特别是配置文件的差异,这种需求很常见,如果用眼睛看,真是眼睛疼. 可以使用linux命令行工具diff a_file b ...

  6. js判断是否为空和typeof的用法

    (1)typeof作用用于查看数据类型 (2)typeof用法typeof 返回值类型有number, string, boolean, function, undefined, objectPS:在 ...

  7. [Abp vNext 源码分析] - 12. 后台作业与后台工作者

    一.简要说明 文章信息: 基于的 ABP vNext 版本:1.0.0 创作日期:2019 年 10 月 24 日晚 更新日期:暂无 ABP vNext 提供了后台工作者和后台作业的支持,基本实现与原 ...

  8. 谜一样的Java编码和Windows编码

    本文适用于Java源码用UTF-8编码,平台系统为Windows的情况 不管是maven,还是javac,你的IDE都会带上一个参数:-Dfile.encoding=UTF-8 Windows(或许W ...

  9. 数据类型(二)---day04

    目录 上节课回顾 五 变量 (一)什么是变量 (二)变量的组成 (三)变量名的命名规范 (四)常量 (五)python变量内存管理 (六)变量的三种打印方式 六 数据类型 (一)数字类型 (二)字符串 ...

  10. CSS盒模型以及如何解决边距重叠问题

    盒模型有两种,W3C 和IE 盒子模型 W3C定义的盒模型包括margin.border.padding.content,元素的宽度width=content的宽度 IE盒模型与W3C盒模型的唯一区别 ...