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 ...
随机推荐
- hihocoder 数论二·Eular质数筛法
数论二·Eular质数筛法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,上次我学会了如何检测一个数是否是质数.于是我又有了一个新的问题,我如何去快速得 ...
- SpringBoot应用入门
一.项目搭建 使用IDEA,点击create new project,然后左边的spring initializr,右边SDK1.8,URL:https://start.spring.io,next ...
- Django与drf 源码视图解析
0902自我总结 Django 与drf 源码视图解析 一.原生Django CBV 源码分析:View """ 1)as_view()是入口,得到view函数地址 2) ...
- Java性能优化的小细节
性能优化实现方式(单纯考虑代码层面): 1.减小代码体积 2.提高运行效率 如何做: 1.尽量指定类.方法的final修饰符 带有final修饰的类是不可派生的,该类所有的方法都是final的,jav ...
- msf之hash攻击
使用hashdump抓取密码(需要系统管理权限) 另外一个更强大的模块 smart_hashdump 如果目标是win7 就需要先绕过UAC 还可以使用msf内置的mimikatz抓取hash msv ...
- ArrayList源码解析(二)
欢迎转载,转载烦请注明出处,谢谢. https://www.cnblogs.com/sx-wuyj/p/11177257.html 自己学习ArrayList源码的一些心得记录. 继续上一篇,Arra ...
- HDU 6045 Is Derek lying?
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=6045 题目: Is Derek lying? Time Limit: 3000/1000 MS (Ja ...
- 如何把应用程序移植到k8s
程序部署环境的容器化已经是大势所趋,微服务为容器化提供了广阔的应用舞台,k8s已经把Docker纳入为它的底层支撑容器引擎,一统江湖,成为了容器技术事实上的标准.一般的应用程序是不能直接拿来部署到容器 ...
- 【python数据分析实战】电影票房数据分析(一)数据采集
目录 1.获取url 2.开始采集 3.存入mysql 本文是爬虫及可视化的练习项目,目标是爬取猫眼票房的全部数据并做可视化分析. 1.获取url 我们先打开猫眼票房http://piaofang.m ...
- Bootstrap应用核心
Bootstrap是当前世界最受欢迎的响应式.移动设备优先的门户和应用前端框架.它不是单一的CSS或JavaScript框架,而是完整的HTML.CSS.JavaScript框架,你可以仅通过Boot ...