第二十八天:内置函数的讲解:

1.在我们学的数据类型中字典可以通过[]来进行获取value的值,那么对象是否可以通过[]来获取属性和方法吗?

2可以通过getitem获得:

class A:
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.age=age
    def __getitem__(self, item):
        pass
        if hasattr(self,item):
            return self.__dict__[item]
f=A(‘alex‘,‘男‘,10)
print(f[‘name‘])  #遇到这种格式会直接执行__getitemz函数如果不存在就报错
结果为
alex

3.也可以通过此方法进行对象属性的添加:

class A:
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.age=age
    def __getitem__(self, item):
        pass
        if hasattr(self,item):
            return self.__dict__[item]
    def __setitem__(self, key, value):
        self.__dict__[key]=value
f=A(‘alex‘,‘男‘,10)
print(f[‘name‘])  #遇到这种格式会直接执行__getitemz函数如果不存在就报错
f[‘hobby‘]=‘basktball‘  #进行属性的添加需要执行setitem函数
print(f.__dict__)
结果为
alex
{‘name‘: ‘alex‘, ‘sex‘: ‘男‘, ‘age‘: 10, ‘hobby‘: ‘basktball‘}

class A:
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.age=age
    def __getitem__(self, item):
        pass
        if hasattr(self,item):
            return self.__dict__[item]
    def __setitem__(self, key, value):
       self.key=value
f=A(‘alex‘,‘男‘,10)
print(f[‘name‘])  #遇到这种格式会直接执行__getitemz函数如果不存在就报错
f[‘hobby‘]=‘basktball‘  #进行属性的添加需要执行setitem函数
print(f.__dict__)

4.删除一个对象中属性的方法:

class A:
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.age=age
    def __getitem__(self, item):
        pass
        if hasattr(self,item):
            return self.__dict__[item]
    def __setitem__(self, key, value):
       self.key=value
f=A(‘alex‘,‘男‘,10)
print(f[‘name‘])  #遇到这种格式会直接执行__getitemz函数如果不存在就报错
f[‘hobby‘]=‘basktball‘  #进行属性的添加需要执行setitem函数
print(f.__dict__)
del f.name
print(f.__dict__)
结果为
alex
{‘name‘: ‘alex‘, ‘sex‘: ‘男‘, ‘age‘: 10, ‘key‘: ‘basktball‘}
{‘sex‘: ‘男‘, ‘age‘: 10, ‘key‘: ‘basktball‘}

class A:
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.age=age
    def __getitem__(self, item):
        pass
        if hasattr(self,item):
            return self.__dict__[item]
    def __setitem__(self, key, value):
       self.key=value
    def __delitem__(self, key):
        del self.key
f=A(‘alex‘,‘男‘,10)
print(f[‘name‘])  #遇到这种格式会直接执行__getitemz函数如果不存在就报错
f[‘hobby‘]=‘basktball‘  #进行属性的添加需要执行setitem函数
print(f.__dict__)
del f[‘name‘]
print(f.__dict__)
结果为
alex
{‘name‘: ‘alex‘, ‘sex‘: ‘男‘, ‘age‘: 10, ‘key‘: ‘basktball‘}
{‘name‘: ‘alex‘, ‘sex‘: ‘男‘, ‘age‘: 10}

5.__new__就是构造方法,创建类中的对象,我们每次创建类时自带的self就是通过此方法进行创建的

class A:
    def __init__(self,x):
        self.x=x
    def __new__(cls, *args, **kwargs):
        print(‘调用即打印‘)
        return object.__new__(cls)
a=A(‘alex‘) #实例化之后就会执行__new__里面的语句
结果为
调用即打印

6.在对类进行实例化时每一个对象所占用的内存都不同:

class A:
    def __init__(self):
        self.x=1
    def __new__(cls, *args, **kwargs):
        return object.__new__(cls)
a=A() #实例化之后就会执行__new__里面的语句
a1=A()
a2=A()
print(a)
print(a1)
print(a2)
结果为<__main__.A object at 0x00000280CFCB90F0>
<__main__.A object at 0x00000280CFE56A90>
<__main__.A object at 0x00000280CFE56AC8>

7.在编程过程中有一种;单例模式:就是说一个类只能实例化一次,当你第一次实力化之后使用这个对象,进行第二次实例化后不在进行创建对象,而是把上一次创建的对象给他,属性也存在,但是可以进行修改,在等第一个值调用时,属性已经变成第二个对象修改的属性了。

class A:
    __key=False
    def __init__(self,name,sex):
        self.name=name
        self.sex=sex
    def __new__(cls, *args, **kwargs):
        if cls.__key:
            return cls.__key
        cls.__key=object.__new__(cls)
        return cls.__key
a=A(‘alex‘,‘男‘)
b=A(‘bin‘,‘不想‘)
print(a.name)
print(b.name)
print(a)
print(b)
结果为
bin
bin
<__main__.A object at 0x0000016E4F4C5F28>
<__main__.A object at 0x0000016E4F4C5F28>

8.如果创建两个对象,两个对象中的传入值相同,那么这两个对象相等吗?

class A:
    def __init__(self,name):
        self.name=name
a=A(‘alex‘)
b=A(‘alex‘)
print(a==b)
结果为
False

  既然他们传入的值都一样结果时false,那么有什么方法能让他们相等吗?

class A:
    def __init__(self,name):
        self.name=name
a=A(‘alex‘)
b=A(‘alex‘)
print(hash(a))
print(hash(b))
结果为
-9223371933925107417
-9223371933925107445

  通过hash值我们不难发现他们的内存地址不同,计算机判断是否相等就是看内存地址是否相同,如果相同就为True,通过下面方法就可以让上述结果为True

class A:
    def __init__(self,name):
        self.name=name
    def __hash__(self):
        return hash(self.name)  #会跟据自己的定义来判断某个对象的hash值
a=A(‘alex‘)
b=A(‘alex‘)
print(hash(a))
print(hash(b))
print(a==b)
结果为
7807086709747762995
7807086709747762995
False

  通过这一步可以让其hash值相等,再通过下面程序就可以让他们相等:

class A:
    def __init__(self,name):
        self.name=name
    def __hash__(self):
        return hash(self.name)  #会跟据自己的定义来判断某个对象的hash值
    def __eq__(self, other):  #
        if self.name==other.name:#让hash值相等的对象返回True
            return True
        return False

a=A(‘alex‘)
b=A(‘alex‘)
print(hash(a))
print(hash(b))
print(a==b)
结果为
1822651601806597939
1822651601806597939
True

原文地址:https://www.cnblogs.com/ab461087603/p/12386374.html

时间: 2024-10-17 08:06:53

第二十八天:内置函数的讲解:的相关文章

第二周(2)——内置函数

                                                              内置函数 abs()√ all() any() ascii() bin() bool() bytearry() bytes() callable() chr() compile() complex() dict() dir() enumerate() help() id() isinstance() float() format() frozenset() globals(

Python成长之路第二篇(1)_数据类型内置函数用法

数据类型内置函数用法int 关于内置方法是非常的多这里呢做了一下总结 (1)__abs__(...)返回x的绝对值 #返回x的绝对值!!!都是双下划线 x.__abs__() <==> abs(x) 例如: #!/usr/bin/python print "abs(-45) : ", abs(-45) print "abs(100.12) : ", abs(100.12) print "abs(119L) : ", abs(119L)

Python成长之路第二篇(2)_列表元组内置函数用法

列表元组内置函数用法list 元组的用法和列表相似就不一一介绍了 1)def append(self, p_object):将值添加到列表的最后 # real signature unknown; restored from __doc__ """ L.append(object) -- append object to end """ pass (2)def count(self, value): 值的出现次数 # real signature

第二十五章 面向对象------封装、内置函数、反射、动态导入

1.封装 什么是封装? 1.对外部隐藏内部的属性,以及实现细节,给外部提供使用的接口 注意:封装有隐藏的意思,但不是单纯的隐藏 学习封装的目的:就是为了能够限制外界对内部数据的访问 python中属性的权限分为两种: 1.公开的 没有任何限制,谁都可以访问 2.私有的 只有当前类本身能狗访问 默认为公共的 为什么要封装? 1.提高安全性 封装属性 2.隔离复杂度 封装方法 一个类中分为两种数据:属性和方法 封装属性 class Student: def __init__(self,name,ag

pyrhon学习_day17___内置函数

3.6版本python共提供68种内置函数,如下图展示,现将重要内置函数的使用做如下讲解: 1.作用域相关:globals()和locals() globals():全局作用域中的变量,无论放在全局命名空间还是在局部命名空间,输出结果一样,都是全局中的变量 locals():放在全局命名空间时和globals()效果一致,放在局部命名空间输出局部空间的变量 def func(): x = 1 y = 2 func() print(locals()) print(globals()) #输出结果一

万恶之源 - Python内置函数一

内置函数 什么是内置函数?就是python帮我们提供的一个工具,拿过直接用就行,比如我们的print,input,type,id等等.截止到python3.6.2版本 中一共提供了68个内置函数.他们就是python直接提供给我们的,有一些我们已经用过了.有一些还没有用过.还有一我们需要学完面向对象才能继续学习.今天我们认识一下python的内置函数 作用域相关 locals()     返回当前作用域中的名字 globals()   返回全局作用域中的名字 迭代器相关 range()   生成

Python中生成器,迭代器,以及一些常用的内置函数.

知识点总结 生成器 生成器的本质就是迭代器. 迭代器:Python中提供的已经写好的工具或者通过数据转化得来的. 生成器:需要我们自己用Python代码构建的 创建生成器的三种方法: 通过生成器函数 通过生成器推导式 python内置函数或者模块提供 生成器函数 yield:一个yield对应一个next,next超过yield数量,就会报错,与迭代器一样. yield与return的区别: return一般在函数中只设置一个,他的作用是终止函数,并传给函数的执行者返回值 yield在生成器中可

Oracle中REGEXP_SUBSTR及其它支持正则表达式的内置函数小结

Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下:在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20','23'的集合. REGEXP_SUBSTR函数格式如下:function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr :需要进行正则处理的字符串__pattern :进行匹配的正则表达式,匹配的值将返回,返回策略由__occurrence决定__po

Python中内置函数的介绍

内置函数的功能介绍 常用内置函数如下: 1.abs() 绝对值 格式:abs(x) 例如:print(abs(-18)) >>> 18 返回值:number #该函数主要用于数值类的操作 2.all() 是否都为真 格式:all(iterable) 例如:print(all([1,2,3,])) >>> Ture 返回值:bool #该函数主要用于可迭代对象的操作,主要为列表.元祖.字典和集合.当这些类型的元素中有空字符串.空列表.空元祖.空字典.空集合时,则返回值为F