精华内容
下载资源
问答
  • For example, setattr(x, 'foobar', 123) is equivalent to x.foobar = 123 设置对象的属性值 说明: 1. setattr函数和getattr函数是对应的。一个设置对象的属性值,一个获取对象属性值。 2. 函数有3个参数,功能是...

    英文文档:

    setattr(object, name, value)

    This is the counterpart of getattr(). The arguments are an object, a string and an arbitrary value. The string may name an existing attribute or a new attribute. The function assigns the value to the attribute, provided the object allows it. For example, setattr(x, 'foobar', 123) is equivalent to x.foobar = 123

    设置对象的属性值

    说明:

    1. setattr函数和getattr函数是对应的。一个设置对象的属性值,一个获取对象属性值。

    2. 函数有3个参数,功能是对参数object对象,设置名为name的属性的属性值为value值。

    >>> class Student:

    def __init__(self,name):

    self.name = name

    >>> a = Student('Kim')

    >>> a.name

    'Kim'

    >>> setattr(a,'name','Bob')

    >>> a.name

    'Bob'

    3. name属性可以是object对象的一个已经存在的属性,存在的话就会更新其属性值;如果name属性不存在,则对象将创建name名称的属性值,并存储value值。等效于调用object.name = value。

    >>> a.age # 不存在age属性

    Traceback (most recent call last):

    File "", line 1, in

    a.age

    AttributeError: 'Student' object has no attribute 'age'

    >>> setattr(a,'age',10) # 执行后 创建 age属性

    >>> a.age # 存在age属性了

    10

    >>> a.age = 12 # 等效于调用object.name

    >>> a.age

    12

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • 8) if check_result: return check_result,400 #400是返回状态码 Python里面应该实现不了通过变量获取变量名,顶多获取到类名,因为Python类型,如果value1和value2相同那么他们就是完全相同的对象,在内存...

    举个例子

    class A:

    def __init__(self,value1,value2):

    self.value1=value1

    self.value2=value2

    def function(value):

    #do some thing and get the name of obj.property

    print(property)

    tempObj=A()

    function(tempObj.value1)#这里会print输出value1,无论value1值是多少

    function(tempObj.value2)#这里会print输出value2,无论value2值是多少

    真实遇到的问题是这样的

    在写restfulApi,每次会在逻辑代码前要检查传入数据的正确性,经常会检查数组的长度

    然后大概写成这样

    def post(self):

    parsed_data = self.parser.parse_args()

    if len(parsed_data.T) < 8:

    return make_parser_error('T', '不得少于8个')

    我想把代码变成

    def post(self):

    parsed_data = self.parser.parse_args()

    check_result=function(parsed_data.T,8)

    if check_result:

    return check_result,400 #400是返回状态码

    Python里面应该实现不了通过变量获取变量名,顶多获取到类名,因为Python是值类型,如果value1和value2值相同那么他们就是完全相同的对象,在内存里面也是指向同一个地方的

    python3

    __dict__class A:

    def __init__(self,v=0):

    self.v=v

    a=A()

    print(a.v) # 0

    for k,v in a.__dict__.items():

    print('key:%s, val:%d' % (k,v))

    # key:v, val:0

    玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd14123.html

    相关文章 Recommend

    展开全文
  • 作者:Vamei出处:...属性的__dict__系统对象的属性可能来自于其类定义,叫做类属性(class attribute)。类属性可能来自类定义自身,也可能根据类定义继承来的。一个对象的属性还可能是该对象实...

    634fc2f22d5314a8c61d3ad522753326.png

    作者:Vamei

    出处:http://www.cnblogs.com/vamei

    Python一切皆对象(object),每个对象都可能有多个属性(attribute)。Python的属性有一套统一的管理方案。

    属性的__dict__系统

    对象的属性可能来自于其类定义,叫做类属性(class attribute)。类属性可能来自类定义自身,也可能根据类定义继承来的。一个对象的属性还可能是该对象实例定义的,叫做对象属性(object attribute)。

    对象的属性储存在对象的__dict__属性中。__dict__为一个词典,键为属性名,对应的值为属性本身。我们看下面的类和对象。chicken类继承自bird类,而summer为chicken类的一个对象。

    class bird(object):    feather = Trueclass chicken(bird):    fly = False    def __init__(self, age):        self.age = agesummer = chicken(2)print(bird.__dict__)print(chicken.__dict__)print(summer.__dict__)

    下面为我们的输出结果:

    {'__dict__': '__dict__' of {'fly': False, '__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x2b91db476d70>}{'age': 2}

    第一行为bird类的属性,比如feather。第二行为chicken类的属性,比如fly和__init__方法。第三行为summer对象的属性,也就是age。有一些属性,比如__doc__,并不是由我们定义的,而是由Python自动生成。此外,bird类也有父类,是object类(正如我们的bird定义,class bird(object))。这个object类是Python中所有类的父类。

    可以看到,Python中的属性是分层定义的,比如这里分为object/bird/chicken/summer这四层。当我们需要调用某个属性的时候,Python会一层层向上遍历,直到找到那个属性。(某个属性可能出现再不同的层被重复定义,Python向上的过程中,会选取先遇到的那一个,也就是比较低层的属性定义)。

    当我们有一个summer对象的时候,分别查询summer对象、chicken类、bird类以及object类的属性,就可以知道summer对象所有的__dict__,就可以找到通过对象summer可以调用和修改的所有属性了。下面两种属性修改方法等效:

    summer.__dict__['age'] = 3print(summer.__dict__['age'])summer.age = 5print(summer.age)

    (上面的情况中,我们已经知道了summer对象的类为chicken,而chicken类的父类为bird。如果只有一个对象,而不知道它的类以及其他信息的时候,我们可以利用__class__属性找到对象的类,然后调用类的__base__属性来查询父类)

    特性

    同一个对象的不同属性之间可能存在依赖关系。当某个属性被修改时,我们希望依赖于该属性的其他属性也同时变化。这时,我们不能通过__dict__的方式来静态的储存属性。Python提供了多种即时生成属性的方法。其中一种称为特性(property)。特性是特殊的属性。比如我们为chicken类增加一个特性adult。当对象的age超过1时,adult为True;否则为False:

    class bird(object):    feather = Trueclass chicken(bird):    fly = False    def __init__(self, age):        self.age = age    def getAdult(self):        if self.age > 1.0: return True        else: return False    adult = property(getAdult)   # property is built-insummer = chicken(2)print(summer.adult)summer.age = 0.5print(summer.adult)

    特性使用内置函数property()来创建。property()最多可以加载四个参数。前三个参数为函数,分别用于处理查询特性、修改特性、删除特性。最后一个参数为特性的文档,可以为一个字符串,起说明作用。

    我们使用下面一个例子进一步说明:

    class num(object):    def __init__(self, value):        self.value = value    def getNeg(self):        return -self.value    def setNeg(self, value):        self.value = -value    def delNeg(self):        print("value also deleted")        del self.value    neg = property(getNeg, setNeg, delNeg, "I'm negative")x = num(1.1)print(x.neg)x.neg = -22print(x.value)print(num.neg.__doc__)del x.neg

    上面的num为一个数字,而neg为一个特性,用来表示数字的负数。当一个数字确定的时候,它的负数总是确定的;而当我们修改一个数的负数时,它本身的值也应该变化。这两点由getNeg和setNeg来实现。而delNeg表示的是,如果删除特性neg,那么应该执行的操作是删除属性value。property()的最后一个参数("I'm negative")为特性negative的说明文档。

    使用特殊方法__getattr__

    我们可以用__getattr__(self, name)来查询即时生成的属性。当我们查询一个属性时,如果通过__dict__方法无法找到该属性,那么Python会调用对象的__getattr__方法,来即时生成该属性。比如:

    class bird(object):    feather = Trueclass chicken(bird):    fly = False    def __init__(self, age):        self.age = age    def __getattr__(self, name):        if name == 'adult':            if self.age > 1.0: return True            else: return False        else: raise AttributeError(name)summer = chicken(2)print(summer.adult)summer.age = 0.5print(summer.adult)print(summer.male)

    每个特性需要有自己的处理函数,而__getattr__可以将所有的即时生成属性放在同一个函数中处理。__getattr__可以根据函数名区别处理不同的属性。比如上面我们查询属性名male的时候,raise AttributeError。

    (Python中还有一个__getattribute__特殊方法,用于查询任意属性。__getattr__只能用来查询不在__dict__系统中的属性)

    __setattr__(self, name, value)和__delattr__(self, name)可用于修改和删除属性。它们的应用面更广,可用于任意属性。

    即时生成属性的其他方式

    即时生成属性还可以使用其他的方式,比如descriptor(descriptor类实际上是property()函数的底层,property()实际上创建了一个该类的对象)。有兴趣可以进一步查阅。

    总结

    __dict__分层存储属性。每一层的__dict__只存储该层新增的属性。子类不需要重复存储父类中的属性。

    即时生成属性是值得了解的概念。在Python开发中,你有可能使用这种方法来更合理的管理对象的属性。

    最后:

    聊一聊:Python中的装饰器

    聊一聊:Python 字典 的用法

    聊一聊:Python 字典 的用法(二)

    聊一聊:Python中的函数

    聊一聊:Python中的上下文管理器

    觉得不错,点个在看呗!

    展开全文
  • 对象拥有类所有性质,那么我们可以通过self,调用类属性。class Human(object): laugh = 'hahahaha' def show_laugh(self): print self.laugh def laugh_100th(self): for i in range(100): self.show...

    调用类的其它信息

    b22a0537662da4a870f3bc17e3f7c077.png

    在定义方法时,必须有self这一参数。这个参数表示某个对象。对象拥有类的所有性质,那么我们可以通过self,调用类属性。

    class Human(object): laugh = 'hahahaha' def show_laugh(self): print self.laugh def laugh_100th(self): for i in range(100): self.show_laugh()li_lei = Human() li_lei.laugh_100th()

    这里有一个类属性laugh。在方法show_laugh()中,通过self.laugh,调用了该属性的值。

    还可以用相同的方式调用其它方法。方法show_laugh(),在方法laugh_100th中()被调用。

    通过对象可以修改类属性值。但这是危险的。类属性被所有同一类及其子类的对象共享。类属性值的改变会影响所有的对象。

    __init__()方法

    __init__()是一个特殊方法(special method)。Python有一些特殊方法。Python会特殊的对待它们。特殊方法的特点是名字前后有两个下划线。

    如果你在类中定义了__init__()这个方法,创建对象时,Python会自动调用这个方法。这个过程也叫初始化。

    class happyBird(Bird): def __init__(self,more_words): print 'We are happy birds.',more_wordssummer = happyBird('Happy,Happy!')

    这里继承了Bird类,它的定义见上一讲。

    屏幕上打印:

    We are happy birds.Happy,Happy!

    我们看到,尽管我们只是创建了summer对象,但__init__()方法被自动调用了。最后一行的语句(summer = happyBird...)先创建了对象,然后执行:

    summer.__init__(more_words)

    'Happy,Happy!' 被传递给了__init__()的参数more_words

    对象的性质

    我们讲到了许多属性,但这些属性是类的属性。所有属于该类的对象会共享这些属性。比如说,鸟都有羽毛,鸡都不会飞。

    在一些情况下,我们定义对象的性质,用于记录该对象的特别信息。比如说,人这个类。性别是某个人的一个性质,不是所有的人类都是男,或者都是女。这个性质的值随着对象的不同而不同。李雷是人类的一个对象,性别是男;韩美美也是人类的一个对象,性别是女。

    当定义类的方法时,必须要传递一个self的参数。这个参数指代的就是类的一个对象。我们可以通过操纵self,来修改某个对象的性质。比如用类来新建一个对象,即下面例子中的li_lei, 那么li_lei就被self表示。我们通过赋值给self.attribute,给li_lei这一对象增加一些性质,比如说性别的男女。self会传递给各个方法。在方法内部,可以通过引用self.attribute,查询或修改对象的性质。

    这样,在类属性的之外,又给每个对象增添了各自特色的性质,从而能描述多样的世界。

    class Human(object): def __init__(self, input_gender): self.gender = input_gender def printGender(self): print self.genderli_lei = Human('male') # 这里,'male'作为参数传递给__init__()方法的input_gender变量。print li_lei.genderli_lei.printGender()

    在初始化中,将参数input_gender,赋值给对象的性质,即self.gender。

    li_lei拥有了对象性质gender。gender不是一个类属性。Python在建立了li_lei这一对象之后,使用li_lei.gender这一对象性质,专门储存属于对象li_lei的特有信息。

    对象的性质也可以被其它方法调用,调用方法与类属性的调用相似,正如在printGender()方法中的调用。

    总结

    通过self调用类属性

    __init__(): 在建立对象时自动执行

    类属性和对象的性质的区别

    展开全文
  • class test(): count = 0 def _init_(self): self.count += 1 a = test() b = test() a.count=5 print(f'{a.count},{b.count},{test.count}') # 5, 2, 2
  • (由Python大本营付费下载自视觉中国)作者 |Radek Fabisiak译者 |弯月,责编 | 郭芮出品 | CSDN(ID:CSDNnews)现如今面向对象编程使用非常广泛,本文我们就来探讨一下Python面向对象编程。以下为译文:Python...
  • 实现私有属性的变更 :param newname: :return: """ self. __name = newname @property def age(self): return self. __age @age.deleter def age(self): """ 实现属性方法删除 :...
  • Python面向对象属性

    2020-11-24 17:01:57
    学习-Python面向对象属性 """ 任务:定义一个 Dog 类,在类中定义属性 name 和 age;在类外部可以修改该 name 和 age 的值通过 input 获取。 """ # 请在下面Begin-End之间按照注释中给出提示编写正确...
  • 三种方法修改类变量,实例对象调用类方法改变类属性的值,类对象调用类方法改变类属性的值,调用实例方法改变类属性的值,类名就是类对象,city就是类变量,#coding=utf-8class employee(object) :city = 'BJ' #类...
  • __dict__ 属性用于查看...程序使用 __dict__ 属性既可查看对象的所有内部状态,也可通过字典语法来访问或修改指定属性。例如如下程序:class Item: def __init__ (self, name, price): self.name = name self....
  • 如果一个属性是以两个下划线开始 就标识这个这个属性是一个私有属性...如果一个属性进行了私有 在类的外面不能调用修改私有属性的值如果需要修改一个对象的属性值,通常有2种方法对象名.属性名 = 数据 ----&gt; ...
  • 该方法可以以键值对(字典)形式导出该类下所有属性及对应,也可以用一个键值对对此进行修改
  • 三种方法修改类变量,实例对象调用类方法改变类属性的值,类对象调用类方法改变类属性的值,调用实例方法改变类属性的值,类名就是类对象,city就是类变量, #coding=utf-8 class employee(object) : city = 'BJ...
  • Python对象属性的操作

    2019-04-10 09:45:23
    # 修改对象属性值 p1.name = 'lisi' print(p1.name) # setattr()是一个内置函数,是给对象添加属性和值 # setattr(对象,属性名(字符串),属性值) # setattr(p1, key, value) # 删除对象属性 de...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼...用实例对象调用类的属性jishu,隐藏了类的这个属性,在这里对该变量的修改,不入会影响到类属性(变量)的。但是如果类属性是可改变的类型,就可以通过实例调用修改...
  • 但是,如果用对象名来修改类属性的,会出现问题:这样做实际的效果是为这个对象重新创建了一个新属性并赋值,而不是修改的属性。 如下图(借用牟琦老师在中国大学慕课上开课的PPT) 图中“zhangsan.money=...
  • 这里就补充面向对象编程中遗漏知识点 ...修改属性的值有三种方法:直接通过实例进行修改;通过方法进行设置;通过方法进行递增(增加的值) 首先我们定义一个车类型类,然后再加上车行驶距离一个...
  • 在面向对象编程中,属性与方法使用十分频繁。接下来对属性的基础操作进行简单... 2,修改属性的值  3,获取属性的值  4,删除属性  通过一段简单示范代码来说明一下: class DemoClass:  pass   o
  • ``` class test(): def __init__(self): self.op=1 ...之后将这个对象的指定属性改为默认值。 我换了几种写法都报错。。 非要为每一个属性修改定一个方法吗?没有简洁的办法吗? 谢谢大家
  • Python中操作属性值的办法有很多,我将通过四个实例来循序渐进的说明。正文:我们通常要对属性进行获取...很多时候我们是不希望一个对象的属性被随意修改的,而且我们希望对象的属性值是有效的,但是通过上面方法...
  • 1.隐藏了属性名,使调用者无法随意的修改对象的属性 2.增加了getter和setter方法,很好的控制的属性是否是只读的 #如果希望属性是只读的,则可以直接去掉setter方法 #如果希望属性不能被外部访问,则可以直接去掉...
  • 遇到一个问题,每次都要动态实例出来一个类。...但是还是输出多次修改一个对象的属性。为什么呢? 原来我修改的是类的属性,不是实例属性,将其属性值改为 init 下self的并赋值就好了。 这个真的是我基础没打牢...
  • Python中操作属性值的办法有很多,我将通过四个实例来循序渐进说明。正文:我们通常要对属性进行获取(getter),修改(setter),删除(deleter)这些操作,比如最简单可以这样实现:### 实例1 ### class Student...
  • 例外一种情况是,当类属性是一个可变对象时(比如一个字典),这时,通过它实例是可以修改这个可变属性的。当类属性修改时,会影响到所有实例,包括修改之前和之后创建实例。2 绑定和方法调用方法是类...
  • 通常我们会将编程语言分为静态和动态。...当类或者对象的属性在需要增加的时候,对于不方便修改源码的情况下,我们可以选择动态的对其添加属性。 动态给对象添加属性 对象属性只在当前对象生效,在其...
  • 动态添加属性当类或者对象的属性在需要增加的时候,对于不方便修改源码的情况下,我们可以选择动态的对其添加属性。动态给对象添加属性对象属性只在当前对象生效,在其他对象中是无法调用的。...
  • 几种面向对象的反射属性hasattr(object,name):判断object里有没有一个name字符串(‘属性名’)对应的方法或属性getattr(object,name):获取属性值setattr(object,name):修改或者新增属性及值dela...
  • class PythonClass(): """ 挂件说明文档 """... def __init__(self): ... # 类变量可被此类所有对象访问 、修改 # 只能 使用类 修改 类变量的值 # 用做数据共...
  • Python面向对象的特殊方法 一、面向对象的特殊方法 在类中可以定义⼀些特殊⽅法,形如__xxx__()这种形式。 特殊⽅法不需要我们调⽤,特殊⽅法会在特定时候⾃动调⽤。 二 、封装 出现封装的原因:我们需要⼀种⽅...
  • 函数getattr(对象,属性名)的功能是访问对象的属性 函数hasattr(对象,属性名)的功能是检查是否存在一个属性,结果为逻辑值 函数setattr(对象,属性名,属性值)的功能是设置一个属性,如果属性不存在,则...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 338
精华内容 135
热门标签
关键字:

python修改对象的属性值

python 订阅