__new__方法:

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

new()是在新式类中新出现的方法,它作用在构造方法init()建造实例之前,可以这么理解,在Python 中存在于类里面的构造方法init()负责将类的实例化,而在init()调用之前,new()决定是否要使用该init()方法,因为new()可以调用其他类的构造方法或者直接返回别的对象来作为本类 的实例。 
如果将类比喻为工厂,那么init()方法则是该工厂的生产工人,init()方法接受的初始化参 数则是生产所需原料,init()方法会按照方法中的语句负责将原料加工成实例以供工厂出货。而 new()则是生产部经理,new()方法可以决定是否将原料提供给该生产部工人,同时它还决定着出 货产品是否为该生产部的产品,因为这名经理可以借该工厂的名义向客户出售完全不是该工厂的产品。 
new()方法的特性: 
new()方法是在类准备将自身实例化时调用。 
new()方法始终都是类的静态方法,即使没有被加上静态方法装饰器。

而在实例化开始之后,在调用 init()方法之前,Python首先调用new()方法:

如果以建房子做比喻,new()方法负责开发地皮,打下地基,并将原料存放在工地。而init()方法负责从工地取材料建造出地皮开发招标书中规定的大楼,init()负责大楼的细节设计,建造,装修使其可交付给客户。

在新式类中new()才是真正的实例化方法

内置方法 必须能看懂 能用尽量用
__len__ len(obj)的结果依赖于obj.__len__()的结果,计算对象的长度
__hash__ hash(obj)的结果依赖于obj.__hash__()的结果,计算对象的hash值
__eq__ obj1 == obj2 的结果依赖于obj.__eq__()的结果,用来判断值相等
__str__ str(obj) print(obj) '%s'%obj 的结果依赖于__str__,用来做输出、显示
__repr__ repr(obj) '%r'%obj的结果依赖于__repr__,还可以做str的备胎
__format__ format() 的结果依赖于__format__的结果,是对象格式化的
__call__ obj()相当于调用__call__,实现了__call__的对象是callable的
__new__ 构造方法,在执行__init__之前执行,负责创建一个对象,在单例模式中有具体的应用
__del__ 析构方法,在对象删除的时候,删除这个对象之前执行,主要用来关闭在对象中打开的系统的资源

_str__和__repr__方法:

来讲一下类中经常用到的 内置函数  __str__和__repr__方法

我个人理解  __repr__是比__str__方法功能更加强大的 一个方法  能让你使用的更加广泛   str就是你在打印你实例的对象的时候你所对类中str方法返回的内容会被输出

__str__和__repr__方法一样它不能用print直接输出 必须用return来返回  然后返回的也必须是字符串类型的

class  List:
def __init__(self, *args):
self.l = list(args)
# def __str__(self):
# return'[%s]' %(','.join([str(i) for i in self.l])) #把你传递进来的 迭代对象中的信息中的元素都转化为字符串类型的 然后把 信息再给转化为列表的额形式输出
def __str__(self): #__str__类型的必须是要用return来返回的 并且返回值也必须是字符串类型的
return 'niha'
l = List(, , , )
print(l)

当需要使用__str__的场景时找不到 __str__就找__repr__当需要使用__repr__的场景时找不到__repr__的时候就找父类的repr双下repr是双下str的备胎

当你的语句中同时出现 str  和repr的时候一定会执行repr里面的内容 因为有repr的同时不会执行str内的内容

__len__方法

len方法估计也和str一样但是返回的只能是int类型 它和len是有着莫大关联的

class A:

    def __len__(obj):
return 222 a = A()
print(len(a))

单例模式:

python中的单例模式 是依靠__new__方法来实现的

下面设计一个让你类创建的对象都是同一个内存地址

就是你创建的所有的对象都是在同一个内存空间,后创建的对象会把之前的空间给覆盖掉

因为你创建对象是开辟一个空间的,并且创建对象是__new__方法来控制的,那么设置不让他调用父类的new方法进行创建对象就可以控制了单例

class B:
__instance = None
def __new__(cls,*args, **kwargs):
if cls.__instance is None : # 类调用自己的私有属性
obj = object.__new__(cls) # 基类在这里就是父类调用自己new就是创建了一个对象 开辟了一个空间
cls.__instance = obj # 把开辟空间赋值给了 自己的私有属性 进行值的改变
return cls.__instance # 私有属性不是了就不会再执行者里面的过程了 def __init__(self,name,age):
self.name = name
self.age = age
def func(self):
print(self.name) a = B('alex', 70)
b = B('agon', 40)
# print(a)
# print(b)
print(a.name)
print(b.name)
# item  对象使用中括号的形式去操作

# __call__
# class Teacher():
# def __call__(self):
# print(123)
# def call(self):print(123)
# t = Teacher()
# t.call()
# t() # 对象名() 相当于调用类内置的__call__
# 一个对象是否可调用 完全取决于这个对象对应的类是否实现了__call__
# callable
# print(callable(Teacher))
# print(callable(t)) # class A:
# def __eq__(self, other):
# # if self.__dict__ == other.__dict__:
# return True
# # __eq__()
# a = A()
# a.name = 'alex'
# b = A()
# b.name = 'egon'
# print(a)
# print(b)
# print(a == b) # == 是由__eq__的返回值来决定的 # __del__ 析构方法: 在删除一个对象的时候做一些首尾工作
# class A:
# def __init__(self):
# pass
# # self.f = open('文件','w')
# def __del__(self):
# print('执行我啦')
# a = A()
# del a
# print('aaa') # class A:
# def __init__(self):
# self.f = open('文件','w')
# def __del__(self):
# self.f.close()
# print('执行我啦')
# a = A()
# del a
# print(a)
# print('aaa') # __new__ 构造方法
# 实例化的时候
# 创造对象的过程 __new__
# __init__ 初始化 # 设计模式 —— 单例模式
# 单例模式 就是 一个类 只能有一个实例
# class A:pass
# a = A()
# b = A()
# print(a)
# print(b) # class B:
# __instance = None
# def __new__(cls, *args, **kwargs):
# if cls.__instance is None:
# obj = object.__new__(cls)
# cls.__instance = obj
# return cls.__instance
# def __init__(self,name,age):
# self.name = name
# self.age = age
# def func(self):
# print(self.name)
# a = B('alex',80)
# b = B('egon',20)
# print(a)
# print(b)
# print(a.name)
# print(b.name) # item
# dic = {'k':'v'}
# print(dic['k']) # class Foo:
# def __init__(self,name):
# self.name=name
#
# def __getitem__(self,item):
# return self.__dict__[item]
#
# def __setitem__(self, key, value):
# self.__dict__[key]=value
#
# def __delitem__(self, key):
# print('del obj[key]时,我执行')
# self.__dict__.pop(key) # f = Foo('alex')
# # f.name = ...
# print(f['name']) # f.__getitem__('name')
# f['age'] = 18 # 赋值
# print(f.age) # 自带的语法
# print(f['age']) # 修改
# f['age'] = 80
# print(f['age']) # 通过实现__getitem__得到的
# del f['age']
# print(f.age) # 删除 # class Foo:
# def __init__(self,name):
# self.name=name
# def __delattr__(self, item):
# print('del obj.key时,我执行')
# self.__dict__.pop(item)
# f = Foo('alex')
# del f.name #相当于执行了__delattr__
# # delattr(f,'name') # 100个同一个类的对象
# Person name age sex
# 100 name sex
# class A:
# pass

__call__方法:

类直接加括号obj()就相当于调用了call方法 你要执行这个方法需要再后面再加上括号  才能执行

class  B:
def __call__(self):
return 6666 b = B()
B() #这一步你是调用call方法
print(b()) #这一步是实现这个方法 class B:
def __call__(self):
print(4444) b = B()
B()()
只有一个对象   只开了一个内存空间
创建一个类 单例模式中的对象属性编程类中的静态属性,所有的方法变成类方法
设计模式 —— java
python中的单例模式 是使用__new__

面向对象进阶------>内置函数 str repr new call 方法的更多相关文章

  1. Python内置函数str()和repr()

    内建函数str()和repr() (representation.表达,表示)或反引號操作符(``)能够方便地以字符串的方式获取对象的内容.类型.数值属性等信息. str()函数得到的字符串可读性好( ...

  2. python中的 dir()内置函数的作用以及使用方法

    dir() 内置函数的作用 python 内置方法有很多,无论是初学者还是精通python 的程序员都不能全部即住所有的方法,这时候 dir() 方法就非常有用了,使用 dir()函数可以查看对象内的 ...

  3. Python内置函数(53)——repr

    英文文档: repr(object) Return a string containing a printable representation of an object. For many type ...

  4. Day 28面向对象的进阶-内置函数(__new__,__del__)

     元类 创造 类  所有类的type 都是他的元类 类创造 对象   具体创造对象的方法 __new__方法 class 类名(classmata = type)#默认是 class 类名(class ...

  5. Python内置函数之repr()

    repr(object) 返回对象的字符串形式. >>> a = 'hello' >>> repr(a) "'hello'" 返回的字符串形式可 ...

  6. 面向对象_内置函数 property

    property 将方法伪装成为属性,可以不用加上()就可以调出其属性. 但是用__dict__,不能调出此属性 from math import pi class Circle: def __ini ...

  7. 面向对象super内置函数(转)

    super函数用来解决钻石继承. 一.python的继承以及调用父类成员 父类: class Base(object): def __init__(self): print("base in ...

  8. 字符串内置函数--str(object)

    ####最重要的6个魔法 join拼接 split分割 find查找 strip去空格 upper变大写 lower变小写 ###(一)拼接字符串 test = '用指定字符拼接字符串元素\n' v1 ...

  9. js内置函数大全及基本使用方法(一)

    一,常规函数 alert函数:显示一个警告对话框,包括一个OK按钮. 语法:alert("hello world"); confirm函数:显示一个确认对话框,包括OK.Cance ...

随机推荐

  1. C# 多线程系列之异步回调(委托)

    本文参考自C#基础:线程之异步回调(委托),纯属读书笔记 在解析异步回调之前,先看同步回调的执行过程,以及代码原理. 1.线程的同步执行 同步执行:在主线程执行的时候,主线程调用一个其它方法,此时主线 ...

  2. JS中typeof和instanceof的用法和区别

    typeof和instanceof的区别 instanceof 常用来判断一个变量是否为空,或者是什么类型的.但它们之间还是有区别的 instanceof的用法 instanceof返回的是一个布尔值 ...

  3. 解决Ubuntu系统的每次开机重启后,resolv.conf清空的问题和DNS域名解析问题(图文详解)

    不多说,直接上干货! 问题情况描述如下: 普及知识:   /etc/resolv.conf ,其实是一个Link .它其实指向的是 /run/resolvconf/resolv.conf.  Ubun ...

  4. 【LESS系列】三角形Mixins

    又是一篇自 W3CPLUS 中转化而来的文章. 和 W3CPLUS 上的做法,在设计上最大的不同就在于,这里我用的是多个 Mixins 函数来实现. 先总结这种做法的特点: 需要额外的标签来实现,因此 ...

  5. WPF中设置了WindowStyle="None"后,窗口仍然有边框的解决方法

    1. 设置了窗体的WindowStyle="None",窗口还是右边框,如下图: 2. 这是因为窗体默认是可以改变大小的,所以需要修改ResizeMode的值 ResizeMode ...

  6. 设计模式--策略模式(strategy)

    1.策略模式(strategy ['strætədʒi]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看 他们生产鸭子,我们就 ...

  7. 实现MySQL数据库的实时备份

    实现MySQL数据库的实时备份 使用MySQL Replication 吴剑 2018-08-03 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian 吴剑 ht ...

  8. 最近在研究asp.net mvc

    看了很多大牛写的博客,依然对mvc云里雾里. 有一点是毋庸置疑的C应该是一座桥梁建立在model和view之间. 在ASP.NET MVC中,控制器通常是继承System.Web.Mvc.Contro ...

  9. golang爬取免费代理IP

    golang爬取免费的代理IP,并验证代理IP是否可用 这里选择爬取西刺的免费代理Ip,并且只爬取了一页,爬取的时候不设置useAgent西刺不会给你数据,西刺也做反爬虫处理了,所以小心你的IP被封掉 ...

  10. 【原】Spring和Dubbo基于XML配置整合过程

    背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时,只需一个 ...