元类 创造 类  所有类的type 都是他的元类

类创造 对象   具体创造对象的方法 __new__方法

class 类名(classmata = type)#默认是

class 类名(classmeta =元类名)

一、__del__方法

# 构造方法 创建一个对象的
# 初始化方法 __init__ 给已经创建出来的对象添加属性
# 析构方法 删除一个对象的时候调用的方法
import time
class A:
def __init__(self):
self.f = open('userinfo','a')
def consume(self):
pass
def __del__(self):
'''在删除一个对象之前做一些收尾工作'''
self.f.close()
print('删除一个对象的时候调用我') a = A()
time.sleep(1)
del a
# 删除一个对象的时候,如果内部存在__del__方法,
# 那么在删除一个对象之前先执行__del__方法中的代码
print(a)
 

二、__new__构造方法

#new 一个对象
# object.__new__()
class A:
def __init__(self):
print('执行init方法了')
def __new__(cls):
print('执行new方法了')
return object.__new__(cls) #创造对象,将对象返回。 a =A()
# 结果:
# 执行new方法了
# 执行init方法了
print(type(a))
print(type(A))
#先执行__new__方法,创造出一个对象。
#然后把创造出来的对象传递给__init__方法.
#会把self自动的返回,被a接收. #元类
#有一个元类 在创建类
# type()所有直接用class创建出来的类的元类都是type
class 类名(B,classMeta =元类名)
class 类名(B,classmeta =type) #默认
#元类 创造 类 所以所有的类的type都是他的元类,默认是type
#类 创造 对象 具体创造对象的方法__new__方法,所有的对象的type
#都是他的对应的

三 、单例模式

一个类可以被多次实例化 ,但是同一时间在python的内存中,只能有一个实例.

一个类 可以被多次实例化 但是同一时间在python的内存中,只能有一个实例
# class A:
# _instance = None
# def __init__(self,name):
# '''给娃穿衣服'''
# self.name = name
# def __new__(cls, *args, **kwargs):
# '''生娃的过程'''
# if not A._instance:
# A._instance = object.__new__(cls)
# return A._instance
# a1 = A('alex') # 第一次实例化的时候创造一个实例
# print(a1.name)
# a2 = A('egon')
# print(a1.name,a2.name) # 'alex' 'alex' # class A:
# def __init__(self,name):
# '''给娃穿衣服'''
# self.name = name
# def __new__(cls, *args, **kwargs):
# '''生娃的过程'''
# if not hasattr(A,'_instance'):
# A._instance = object.__new__(cls)
# return A._instance
# a1 = A('alex') # 第一次实例化的时候创造一个实例
# print(a1.name)
# a2 = A('egon')
# print(a1.name,a2.name) # 'alex' 'alex' # class A:
# name = 'Alex'
#
# @classmethod
# def func(cls):
# pass
#
# A.name = 'Egon'

四、 item系列 

class A:
def __init__(self,name):
self.name =name
self.age =81
def __getitem__(self, item):
return self.__dict__[item]
def __setitem__(self, key, value):
self.__dict__[key]=value
def __delitem__(self, key):
del self.__dict__[key] a =A('alex')
print(a['name']) #对应了类中一个方法的语法
print(a.name)#同上
print(a['age'])#对于了类中一个方法的语法
print(a.age)#同上
# 增加和修改一个属性
a['sex']= '不详'
# print()
print(a.__dict__)
print(a.sex)
print(a['sex'])
a['sex']='女'
print(a.__dict__)
del a['sex']
print(a.__dict__)

五、__call__方法

对象后面加括号,触发执行。

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class  A:
def __call__(self,a):
print('执行我了',a)
def call(self,a):
print('执行了我',a)
A()('aaa')
# a =A()
# a('aaa')# __call__
结果 :

执行我了 aaa

六、__hash__方法

# hash
# 不可变的数据类型都可以被hash
class A:pass
# def __hash__(self):
# return 1
a = A()
b = A()
print(hash(a)) # object.__hash__()
print(hash(a)) # object.__hash__()
print(hash(a)) # object.__hash__()
print(hash(a)) # object.__hash__()
print(hash(a)) # object.__hash__()
print(hash(a)) # object.__hash__()
print(hash(a)) # object.__hash__()
print(hash(b)) # object.__hash__() # dict的key set的元素
# dic key --> value
# dic[key] = value # hash(obj)函数,obj对象对应的类必然内部实现了__hash__方法
# hash的结果就是__hash__方法的返回值
# 且在一次成的执行过程中是不会发生变化的
# 且要想作为字典的key或者作为集合的元素,这个对象对应的类必须实现__hash__方法

Day 28面向对象的进阶-内置函数(__new__,__del__)的更多相关文章

  1. 面向对象进阶------>内置函数 str repr new call 方法

    __new__方法: 我们来讲个非常非常重要的内置函数和init一样重要__new__其实在实例话对象的开始  是先继承父类中的new方法再执行init的  就好比你生孩子 先要把孩子生出来才能对孩子 ...

  2. Python 面向对象 (补充) , 反射 , 内置函数

    面向对象中内置函数 issubclass方法: 检查第一个参数是否是第二个参数的子子孙孙类     返回  :   是一个布尔值 class Base(object): pass class Foo( ...

  3. python基础语法20 面向对象5 exec内置函数的补充,元类,属性查找顺序

    exec内置函数的补充 exec: 是一个python内置函数,可以将字符串的代码添加到名称空间中; - 全局名称空间 - 局部名称空间 exec(字符串形式的代码, 全局名称空间, 局部名称空间) ...

  4. python之路----面向对象中的内置函数

    property属性 什么是特性property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法 ...

  5. python面向对象--类的内置函数

    #isinstance(obj,cls)判断obj是否是类cls的实例 #issubclass(cls,cls1)判断cls是否是cls1的子类或派生类 class Foo: pass class B ...

  6. 内置方法 __new__ __del__

    1.__new__ 构造方法 实例化对象是先执行__new__方法,但是类中没有__new__方法,所以先到父类object类中的new方法,开辟一个属于对象的空间,然后再执行init方法 设计模式: ...

  7. day28 面向对象:反射,内置函数,类的内置方法

    面向对象进阶博客地址链接: http://www.cnblogs.com/Eva-J/articles/7351812.html 复习昨日内容: # 包 # 开发规范 # # hashlib # 登录 ...

  8. python面向对象的基础语法(dir内置函数、self参数、初始化方法、内置方法和属性)

    面相对象基础语法 目标 dir 内置函数 定义简单的类(只包含方法) 方法中的 self 参数 初始化方法 内置方法和属性 01. dir 内置函数(知道) 在 Python 中 对象几乎是无所不在的 ...

  9. python面向对象的多态-类相关内置函数-类内置魔法函数-迭代器协议-上下文管理-04

    多态 一种事物具备不同的形态 例如:水 --> 固态.液态.气态 多态:# 多个不同对象可以相应同一个对象,产生不同的结果 首先强调,多态不是一种特殊的语法,而是一种状态,特性(多个不同对象可以 ...

随机推荐

  1. 创建和修改主键 (SQL)

    添加主键, ALTER TABLE [表名:OrderInfo] Add PRIMARY KEY ([列名:ProductID, UserID...])  多个列则是组合主键 删除主键, ALTER ...

  2. Java 检查异常(checked exception)和未检查异常(unchecked exception)区别理解

    所有异常类型都是 Throwable 类的子类,它包含Exception类和Error类,Exception又包括checked exception和unchecked exception. unch ...

  3. Spring boot 默认静态资源路径与手动配置访问路径的方法

    这篇文章主要介绍了Spring boot 默认静态资源路径与手动配置访问路径的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下   在application.propertis中配置 ##端口号 ...

  4. 【JS】判断浏览器类型

    判断原理 JavaScript是前端开发的主要语言,我们可以通过 编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根据各种浏览器独有的属性 ...

  5. 面向对象先修:Java入门

    学习总结 在C语言和数据结构的基础上,在上暑期的面向对象Java先修课程时,熟悉语言的速度明显加快了很多.Java和C在很多基础语法上非常相似,比如基本的数据类型,循环以及条件分支语句,数组的遍历等. ...

  6. 2018.09.02 bzoj1296: [SCOI2009]粉刷匠(dp套dp)

    传送门 dp好题. 先推出对于每一行花费k次能最多粉刷的格子数. 然后再推前i行花费k次能最多粉刷的格子数. 代码: #include<bits/stdc++.h> #define N 5 ...

  7. 42 Can stress be Avoided ? 压力能够回避吗 ?

    Can stress be Avoided ? 压力能够回避吗 ? ①In the 1960s, medical researchers Thomas Holmes and Richard Rahe ...

  8. C++之类和对象课后习题1

    建立一个对象数组,内放5个学生的(学号,成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生的最高成绩者,并输出其学号. #include<iostream> ...

  9. Excel获得焦点变色

    1.  点击 Sheet 2. 右键菜单  查看代码 3. 复制如下代码 Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Ran ...

  10. Linux 系统运维常用命令

    1 文件管理2 软件管理3 系统管理4 服务管理5 网络管理6 磁盘管理7 用户管理8 脚本相关9 服务配置==================================------------ ...