问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

python菜鸟问题?

发布网友 发布时间:2022-04-13 04:46

我来回答

3个回答

懂视网 时间:2022-04-13 09:07

Python 描述符是一种创建托管属性的方法。每当一个属性被查询时,一个动作就会发生。这个动作默认是get,set或者delete。不过,有时候某个应用可能会有

更多的需求,需要你设计一些更复杂的动作。最好的解决方案就是编写一个执行符合需求的动作的函数,然后指定它在属性被访问时运行。一个具有这种功能的对象

称为描述符。描述符是python方法,绑定方法,super,PRoperty,staticmethod和classmethod的实现基础。

1.描述符协议

描述符descriptor就是一个表示属性值的对象,通过实现一个或多个__get__,__set__,__delete__方法,可以将描述符与属性访问机制挂钩,还可以自定义这些操作。

__get__(self,instance,own):用于访问属性,返回属性的值。instance为使用描述符的实例对象,own为实例所属的类。当通过类访问属性时,instance为None。

__set__(self,instance,value):设定属性值。

__delete__(self,instance):删除属性值。

2.描述符如何实现

class Descriptor(object):
def __get__(self, instance, owner):
print 'getting:%s'%self._name
return self._name
def __set__(self, instance, name):
print 'setting:%s'%name
self._name = name
def __delete__(self, instance):
print 'deleting:%s'%self._name
del self._name
class Person(object):
name = Descriptor()

一个很简单的描述符对象就产生了,现在可以对一个Person对象进行属性name的读取,设置和删除:

>>> p=Person()
>>> p.name='john'
setting:john
>>> p.name
getting:john
'john'
>>> del p.name
deleting:john

注意:描述符只能在类级别上进行实例化,不能通过在__init__()和其他方法中创建描述符对象来为每个实例创建描述符。

具有描述符的类使用的属性名称比实例上存储的属性名称具有更高的优先级。为了能让描述符在实例上存储值,描述符必须挑选一个与它本身所用名称不同的名称。

如上例,Person类初始化__init__函数为实例设置属性就不能用name名称了。

data描述符与none-data描述符:

如果实现了__get__和__set__就是一个data描述符,如果只有__get__就是一个non-data描述符。不同的效果在于data描述符总是替代在一个实例中的属性实现,

而non-data描述符由于没有set,在通过实例对属性赋值时,例如上面的p.name = 'hello',不会再调用__set__方法,会直接把实例属性p.name设为'hello'。

当然如果仅仅在__set__中raise AttributeError,仍然得到的是一个non-data的描述符。

描述符调用机制:

当查询一个对象的属性a.attr时,如果python发现attr是个描述符对象,如何读取属性取决于对象a:

直接调用:最简单的调用是直接使用代码调用描述符的方法,attr.__get__(a)

实例绑定:如果a是个实例对象,调用方法:type(a).__dict__['attr'].__get__(a,type(a))

类绑定:如果A是个类对象,调用方法:A.__dict__['attr'].__get__(None,A)

super绑定:如果a是个super实例,那么super(B,obj).m()通过查询obj.__class__.__mro__找到B的基类A,然后执行A.__dict__['m'].__get__(obj,obj.__class__)

3.执行属性类型检查的描述符

class TypedProperty(object):
def __init__(self,name,attr_type,default=None):
self.name='_'+name
self.type=attr_type
self.default=default if default else attr_type()
def __get__(self,instance,own):
return getattr(instance,self.name,self.default)
def __set__(self,instance,value):
if not isinstance(value,self.type):
raise TypeError,'Must be %s'%self.type
setattr(instance,self.name,value)
def __delete__(self,instance):
raise AttributeError('Can not delete attribute')
class Foo(object):
name=TypedProperty('name',str)
num=TypedProperty('num',int,37)

上述描述符可以对属性的类型进行检查,如果name属性不设为str类型或者num不设为int类型,就会报错:

>>> f.name=21
TypeError: Must be <type 'str'>

而且禁止对属性进行删除操作:

>>> del f.name
AttributeError: Can not delete attribute

f.name 隐形的调用type(f).__dict__['name'].__get__(f,Foo),即Foo.name.__get__(f,Foo)。

上述描述符实际是存储在实例上的,name通过setattr(f,_name,value)存储在f._name上,num存储在f._num上,这也是加下划线的原因,

否则描述符名称name会和实例属性name发生冲突,描述符属性f.name会覆盖掉实例属性f.name。

热心网友 时间:2022-04-13 06:15

client.connect(("localhost",6969))
提示告诉你,connect方法不能接收元组对象作为参数,("localhost",6969)这样是一个元组
修改为
client.connect("localhost",6969)追问

修改后显示错误为:TypeError: descriptor 'connect' for '_socket.socket' objects doesn't apply to a 'str' object

又试了试把引号去掉或者加上还是不行

追答


client.connect("localhost",6969)改回元组,这个方法接收的是一个元组参

热心网友 时间:2022-04-13 07:33

你在哪看到这样的写法的connect(("localhost",6969))
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 黑客攻击报案有用吗 小学生没身份证怎么买火车票 身高1.6儿童没身份证怎么买火车票? 小学生没有身份证可以网上买票吗 求梁静茹在《理性与感性》演唱会的视频 郭冬临邵峰小品爱的代驾播放的什么歌曲?求歌名 张艾嘉,李宗盛,梁静茹,张信哲在一起唱《爱的代价》是哪个场合? 请问JS大卖场 爱的代价 都用了哪些视频 梁咏琪 爱的代价MV里面分别是她的什么电影 求一《足球之夜》早期视频~视频的背景音乐是张艾嘉版的《爱的代价》~很感人的视频~ 爱的代价-王太利(MP3) 想要李宗盛《爱的代价》伴奏,最好有视频的,谢谢,麻烦发我邮箱xhj_120@hotmail.com 求视频:爱的代价 邓丽君原唱 哪里能看泰剧爱的代价? 谁能找到梁咏琪<爱的代价>的视频连接地址啊,往QQ空间里加啊,不是FIASH 跪求由姜文主演的电视剧爱的代价的视频,给我个链接也行啊,自己一直找不到,先谢谢了。 急需六年级的学习计划表(追加悬赏) 求六年级学生作息时间表 六年级学生作息时间表 刷单要电脑ip地址干嘛 j6空滤器多大流量1109010 怎么修复u盘的文件 出口到荷兰鹿特丹 出口一批货物到鹿特丹,生产工厂在浙江。 进荷兰鹿特丹清关的税金是怎么计算的? 从中国出口到鹿特丹的货没有收货人怎么办?可以转运到都柏林再清关吗? 外贸公司出口自行车至荷兰,共28500辆,出口价格每辆75CFR鹿特丹。其中从中国口岸至鹿特丹海运占7.5%计算 我国某进出口公司以CIF鹿特丹条件出口一批蔬菜,由于该商品季节性较强,买卖双方在合同中规定:“买方 从宁波港发到德国鹿特丹,货代开出的费用,明细表请有识之士给于评价下,货代的费用那些开高了? 某公司以每件25.00美元FOBC2%鹿特丹出口一批货物,共25850件,总重量为45.5公斤,总体积为125.560立方米 我国某进出口公司欧洲一批货物,报价为CFR鹿特丹,货价总值为10000美元,投保一切险 荷兰鹿特丹港口到深圳蛇口途径哪些? 从波斯湾经地中海驶往鹿特丹、沿途经过的著名海峡有哪几个? python调用属性的语句是 ios9.02系统的变态微商怎么不能通讯录群发好友 我是一名螳螂新手,怎么养 我抓到了一只螳螂,怎么喂养 螳螂能养熟 怎样养螳螂 新手适合养什么螳螂 胸部下垂可以做整形吗