python面向对象<三>
类属性、实例属性:
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面向对象<三>的更多相关文章
- Python面向对象三要素-继承(Inheritance)
Python面向对象三要素-继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承概述 1>.基本概念 前面我们学习了Python的面向对象三 ...
- Python面向对象三要素-封装(Encapsulation)
Python面向对象三要素-封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.封装概述 将数据和操作组织到类中,即属性和方法 将数据隐藏起来,给 ...
- Python面向对象(三)
一.绑定方法与非绑定方法 一.绑定方法:绑定给谁就应该由谁来调用,谁来调用就会将谁当作第一个参数传入 1.绑定给对象的方法:类中定义的函数默认就是绑定给对象的 2.绑定给类的方法:为类中定义的函数加上 ...
- Python面向对象三要素-多态
Python面向对象3要素-多态 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 OCP原则:多用“继承”,少修改. 继承的用途:在子类上实现对基类的增强,实现多态. ...
- Python 面向对象三(转载)
来源:Mr.Seven www.cnblogs.com/wupeiqi/p/4766801.html 四.类的特殊成员 上文介绍了Python的类成员以及成员修饰符,从而了解到类中有字段.方法和属性三 ...
- python 面向对象三 访问权限 下划线 双下划线
一.双下划线 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问. ...
- python 面向对象(三)类与类之间的关系 初始化方法一些类
###################总结################# 面试的时候 让写python一些特殊方法 __init__ 创建对象的时候初始化 __new__对象实例化调用第一个方法 ...
- python 面向对象(三)--继承和多态
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Supe ...
- Python 面向对象(三) 魔术方法
__getitem__ 在对实例或对象使用索引访问时调用,self[key]__dir__ 收集当前模块的信息,包括继承自其它基类(包括object类)的属性和方法 __new 定义如何创建实例__i ...
随机推荐
- Docker容器启动失败 Failed to start Docker Application Container Engine的解决办法
当编辑完daemon.json时,准备systemctl start docker.service启动docker时报以下错误: 网上查找的诸多方法都不行,后面看到一篇类似的文章:http://www ...
- 如何更快理解和运用服务编排?(使用Goku API Gateway实现)
上一篇博客 未来实现API管理系统的几个关键词 发布后,有不少读者私信我,让我写一篇实际运用的文章,我周末趁着有空写了这篇有关“服务编排”的文章.用的是Goku API Gateway进行演示, 希望 ...
- Fiddler的基本使用
目录 清空历史请求 请求所消耗的时间 发送的数据在 设置fiddler过滤请求 模拟弱网环境 Ctrl+R 拦截数据,拦截数据又称"打断点" fiddler开启的时候就是默认开始抓 ...
- AWD攻防工具脚本汇总(一)
最近工作很忙 今天抽空准备下AWD比赛得攻防工具和脚本 以下只是常用 希望下周不被吊锤~~ 后续整理后想抽空写成一个攻击框架汇总放github~~ 这里从各种情景和需求中去总结工具和脚本的使用 情 ...
- Unity 场景中看不到物体或者OnDrawGizmos画的线看不到
有时候,Unity中的场景里面,物体突然看不见了,可以这样做: 首先,在 Hierarchy 面板选择看不见的物体,按下快捷键 f.如果物体还是看不见,见下图: 看看图中圈红的地方.如果,如果 ...
- opencv::两张图片的线性融合
理论-线性混合操作 g(x) 表示 融合图片中的像素点,f0(x) 和 f1(x) 分别表示背景和前景图片中的像素点. //参数1:输入图像Mat – src1 //参数2:输入图像src1的alph ...
- linux自启动脚本.sh
while [ 1 ]; do PRO_NUM=`ps -ef | grep "cms$" | grep -v "grep" | wc ...
- 造轮子了!NETCore跨平台UI框架,CPF
CPF(暂时命名)(Cross platform framework),模仿WPF的框架,支持NETCore的跨平台UI框架,暂时不够完善,只用于测试,暂时只支持Windows和Mac.支持数据绑定, ...
- python类中的self
class User: def walk(self): print(self,"正在慢慢走") # User.walk() # 会报错 TypeError: walk() miss ...
- httprunner-1-linux下搭建hrun(上)
前言 相信不少小伙伴对开源项目 httprunner 都很感兴趣,我们来看下它的有哪些特点吧: 项目管理:新增项目.列表展示及相关操作,支持用例批量上传(标准化的HttpRunner json和yam ...