面向对象进阶------>内置函数 str repr new

__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()才是真正的实例化方法

_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(1, 2, 3, 4)
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))

单例模式:

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

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‘, 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

原文地址:https://www.cnblogs.com/askzyl/p/8886348.html

时间: 2024-11-03 16:23:04

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

Python标准库:内置函数str(object='') str(object=b'', encoding='utf-8', errors='strict')

本函数是实现返回字符串对象.参数object是要转换内容的对象:参数encoding是编码方式:errors是错误处理方式. 例子: #str() print(str(b'abc')) print(str(200)) print(str(b'\xe5\x93\x88\xe5\x93\x88', encoding = 'utf-8', errors = 'ignore')) print(str('蔡屋围'.encode('utf-8'), encoding = 'utf-8', errors =

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

内建函数str()和repr() (representation.表达,表示)或反引號操作符(``)能够方便地以字符串的方式获取对象的内容.类型.数值属性等信息. str()函数得到的字符串可读性好(故被print调用) repr()函数得到的字符串通常能够用来又一次获得该对象,通常情况下 obj==eval(repr(obj)) 这个等式是成立的. 这两个函数接受一个对象作为其參数,返回适当的字符串. 其实repr()和``做一样的事情,返回一个对象的"官方"字符串表示.其结果绝大多

python进阶 内置函数

内置函数: 一.map 对序列的每一个元素进行操作,最终获得操作后的新序列. 实例: #!/usr/bin/env  python# --*--coding:utf-8 --*--li = [11, 22, 33]news = map(lambda a: a + 2, li)print newsli = [22, 33, 44]l1 = [11, 22, 33]news = map(lambda a, b: a - b, li, l1)print newsli = [11, 22, 33]new

python-38-用于面向对象的内置函数

前言 在面向对象中有很多内置方法,你会发现都很容易知道它的用处与平时用到的函数一样. 1.__str__ 2.__repr__ 3.__len__ 4.__del__ 5.__call__ 6.item系列 7.__new__ 8.__eq__ 9.__hash__ 1.__str__:一旦被调用,就返回调用这个方法的对象的内存地址. # 1.__str__:一旦被调用,就返回调用这个方法的对象的内存地址 class A: def __init__(self,name):self.name=na

Python内置函数(53)——repr

英文文档: repr(object) Return a string containing a printable representation of an object. For many types, this function makes an attempt to return a string that would yield an object with the same value when passed to eval(), otherwise the representatio

面向对象进阶——内置方法(二)

七.__setitem__, __getitem__, __delitem__ item系列 class Foo: def __init__(self, name): self.name = name def __getitem__(self, item): # print('getitem...') #print(item) return self.__dict__.get(item) # 字典get方法有则取值,无也不会报错 def __setitem__(self, key, value)

面向对象_内置函数与内置方法

老师的博客关于此知识点 http://www.cnblogs.com/Eva-J/articles/7351812.html#_label7 __str__和__repr__ 改变对象的字符串显示__str__,__repr__ 先来看一段代码 class Course: belong_to='old boy' def __init__(self,name,number,site,teacher): self.name=name self.number=number self.site=site

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

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

内置函数:repr

将变量原封不动的打印出来,字符串类型打印出来带引号 print('1')#1 print(1)#1 print(repr('1'))#'1' print(repr(1))#1 格式化输出%r i = 'aike' print('我是%s'%i)#我是aike print('我是%r'%i)#我是'aike' 原文地址:https://www.cnblogs.com/aizhinong/p/11407507.html