面向对象进阶-item系列、__new__、__hash__、__eq__ (四)
item系列
dic = {'k':'v'}
# 对象 : 存储属性 和调用方法
dic['k'] = 'v'
# class Foo:
# def __init__(self,name,age,sex):
# self.name = name
# self.age = age
# self.sex = sex
#
# def __getitem__(self, item):
# if hasattr(self,item):
# return self.__dict__[item]
#
# def __setitem__(self, key, value):
# self.__dict__[key] = value
#
# def __delitem__(self, key):
# del self.__dict__[key]
#
# f = Foo('egon',38,'男')
# print(f['name'])
# f['hobby'] = '男'
# print(f.hobby,f['hobby'])
# del f.hobby # object 原生支持 __delattr__
# del f['hobby'] # 通过自己实现的
# print(f.__dict__)
__new__
# __init__ 初始化方法
# __new__ 构造方法 : 创建一个对象
class A:
def __init__(self):
self.x = 1
print('in init function')
# def __new__(cls, *args, **kwargs): 为什么这里是cls而不是self,因为先执行_new_才有self
# print('in new function')
# return object.__new__(A, *args, **kwargs) 执行object后才产生类A
a =A()
print(a)》》》显示 :'in new function' 'in init function'
# a1 = A()
# a2 = A()
# a3 = A()
# print(a1)
# print(a2) a1/a2/a3打印出的内存地址不一样,多个类对象的内存空间
# print(a3)
# print(a.x)
# 设计模式
# 23种
# 单例模式
# 一个类 始终 只有 一个 实例
# 当你第一次实例化这个类的时候 就创建一个实例化的对象
# 当你之后再来实例化的时候 就用之前创建的对象
# class A:
# __instance = False
# def __init__(self,name,age):
# self.name = name
# self.age = age
# def __new__(cls, *args, **kwargs):
# if cls.__instance: 第二次为真,执行这里
# return cls.__instance
# cls.__instance = object.__new__(cls) cls可不填 第一次__instance为假执行这里,创建对象赋值给cls.__instance
# return cls.__instance
#
# egon = A('egg',38)
# egon.cloth = '小花袄'
# nezha = A('nazha',25)
# print(nezha) 》内存地址一样
# print(egon) 》》内存地址一样
# print(nezha.name) 》nazha
# print(egon.name) 》》nazha
# print(nezha.cloth) 》》'小花袄'
__eq__
# class A:
# def __init__(self,name):
# self.name = name
#
# def __eq__(self, other): eq方法
# if self.__dict__ == other.__dict__:
# return True
# else:
# return False
#
# ob1 = A('egon')
# ob2 = A('egg')
# print(ob1 == ob2) 》》False 没有__eq__时默认比较内存地址,等于不成立false
__hash__哈希
# hash() 哈希值,不同对象,哈希值不同
# class A:
# def __init__(self,name,sex):
# self.name = name
# self.sex = sex
# def __hash__(self): 哈希值是否相等由自定义hash来控制,不走内置hash()
# return hash(self.name+self.sex)
#
# a = A('egon','男')
# b = A('egon','nv')
# c = A('egon','nv')
# print(hash(a))
# print(hash(b))
# print(hash(c)) b和c哈希值一样
import json
from collections import namedtuple
Card = namedtuple('Card',['rank','suit']) # rank 牌面的大小 suit牌面的花色(这个相当于一个只有属性的类)
C1=Card(2,"红心")》print(C1)》Card(rank=2,suit="红心")(实例化)
# class FranchDeck:
# ranks = [str(n) for n in range(2,11)] + list('JQKA') # 2-A
# suits = ['红心','方板','梅花','黑桃']
#
# def __init__(self):
# self._cards = [Card(rank,suit) for rank in FranchDeck.ranks
# for suit in FranchDeck.suits]
解释》》for suit in FranchDeck.suits
for rank in FranchDeck.rangks 》》》
Card(suit,rank) 《《

#
# def __len__(self):
# return len(self._cards)
#
# def __getitem__(self, item):
# return self._cards[item]
#
# def __setitem__(self, key, value):
# self._cards[key] = value
#
# def __str__(self):
# return json.dumps(self._cards,ensure_ascii=False)
# deck = FranchDeck()
# print(deck[10])
# from random import choice
# print(choice(deck)) choice依赖_len_方法
# # print(choice(deck))
# from random import shuffle
# shuffle(deck) shuffle依赖setitem方法
# print(deck[10])
# print(deck)
# print(deck[:5]) #切片,利用items系列
# 内置函数 内置的模块 内置的基础类型 < --- >类的内置方法
# == 》》内置调用 __eq__
# len() 》》内置调用__len__
# 100 名字 和 性别 年龄不同
# set 集合,可以去重
# class A:
# def __init__(self,name,sex,age):
# self.name = name
# self.sex = sex
# self.age = age
#
# # def __eq__(self, other):
# # if self.name == other.name and self.sex == other.sex:
# # return True
# # return False
#
# def __hash__(self):
# return hash(self.name + self.sex)
# a = A('egg','男',38)
# b = A('egg','男',37)
# print(set((a,b))) # unhashable(是不可哈希意思)
# set 依赖对象的 hash eq
面向对象进阶-item系列、__new__、__hash__、__eq__ (四)的更多相关文章
- 面向对象的进阶(item系列,__new__,__hash__,__eq__)
面向对象的进阶(item系列,__new__,__hash__,__eq__) 一.item系列 getitem.setitem.delitem(操作过程达到的结果其实就是增删改查) class ...
- python面向对象( item系列,__enter__ 和__exit__,__call__方法,元类)
python面向对象进阶(下) item系列 __slots__方法 __next__ 和 __iter__实现迭代器 析构函数 上下文管理协议 元类一.item系列 把对象操作属性模拟成字典的 ...
- __del__,item系列 ,hash方法,__eq__,
# 构造方法 申请一个空间# 析构方法 释放一个空间 # 某个对象借用了操作系统的资源,还要通过析构方法归还回去:文件资源 网络资源 # 垃圾回收机制 class A: def __del__(sel ...
- python 全栈开发,Day24(复习,__str__和__repr__,__format__,__call__,__eq__,__del__,__new__,item系列)
反射: 使用字符串数据类型的变量名来使用变量 wwwh即what,where,why,how 这4点是一种学习方法 反射 :使用字符串数据类型的变量名来使用变量 1.文件中存储的都是字符串 2.网络 ...
- 1、__del__ 2、item系列 3、__hash__ 4、__eq__
1.__del__ 析构方法 释放一个空间之前之前 垃圾回收机制 2.item系列 和对象使用[ ]访问值有联系 __getitem__ __setitem__ __delit ...
- day7--面向对象进阶(内含反射和item系列)
一面向对象的结构和成员 1.1面向对象的结构 class A: company_name = '老男孩教育' # 静态变量(静态字段) __iphone = '1353333xxxx' # 私有静态变 ...
- [.net 面向对象程序设计进阶] (25) 团队开发利器(四)分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境
[.net 面向对象程序设计进阶] (25) 团队开发利器(四)分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境 本篇导读: 前面介绍了两款代码管理工具 ...
- 面向对象 反射 和item系列和内置函数和__getattr__和__setattr__
反射 反射主要用在网络编程中, python面向对象的反射:通过字符串的形式操作对象相关的属性.python的一切事物都是对象. 反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函 ...
- python进阶(7):面向对象进阶
学了面向对象三大特性继承,多态,封装.今天我们看看面向对象的一些进阶内容,反射和一些类的内置函数. 一.isinstance和issubclass class Foo: pass class Son( ...
随机推荐
- struts2框架值栈的概述之问题一:什么是值栈?
1. 问题一:什么是值栈? * 值栈就相当于Struts2框架的数据的中转站,向值栈存入一些数据.从值栈中获取到数据. * ValueStack 是 struts2 提供一个接口,实现类 OgnlVa ...
- 【z】Storm - the world's best IDE framework for .NET
http://www.codeproject.com/Articles/42799/Storm-the-world-s-best-IDE-framework-for-NET Storm - the w ...
- c++ tricks
1 关于virtual关键字的实验 1.1 在派生类中改变virtual函数访问权限 定义两个类A,B,其中B公有派生于A.A中定义一个private成员虚函数func,B中覆写此函数,但是将其访问权 ...
- 交互神器-最好用的Mac原型设计工具
市场上有着大量的开发和设计工具支持在Mac上安装使用,今天给大家强烈推荐一款Mac上的原型设计工具-Mockplus,原型工具在产品开发设计中是必不可少的,无论是现在非常火的小程序设计,还是网页设计, ...
- MySQL的left on 【zt】
MySQL的left on [zt] (2008-11-03 17:27:30) 转载▼ 标签: it 分类: 学习笔记 MySQL多表连接查询Left Join,Right Join php开源嘛 ...
- Number.isInteger在IE中报错的解决方法
if (!Number.isInteger) { Number.isInteger = function(num) { return typeof num == "number" ...
- 2018.09.15 vijos1053Easy sssp(最短路)
传送门 貌似可以最短路时同时判定负环啊. 但我不想这样做. 于是写了一个dfs版的判环,bfs版的求最短路. 代码: #include<iostream> #include<ccty ...
- hdu-1253(bfs+剪枝)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 思路:简单的bfs,就是要注意剪枝. #include<iostream> #inc ...
- Django入门与实践-第25章:Markdown 支持(完结)
http://127.0.0.1:8000/boards/1/topics/102/reply/ 让我们在文本区域添加 Markdown 支持来改善用户体验. 你会看到要实现这个功能非常简单. 首先, ...
- arduino uno r3 + SIM900 + USB打火机 实现电话触发点火
需求来源 1.儿子过完年6岁,喜欢玩烟花,但是胆子小,于是我就负责点火,从年前26到大年初八,每天晚上要给儿子点鞭炮啊点鞭炮. 2.这边过年要打关门炮跟开门炮,大年初一凌晨还要起来帮老妈点鞭炮,说实在 ...