Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向Python对象添加新属性?_Python - Fatal编程技术网

向Python对象添加新属性?

向Python对象添加新属性?,python,Python,由于来自OOPS背景,从中看到下面的代码看起来很奇怪 我的问题: (一) 根据上述代码, f是指向类“函数”的对象f的参考变量吗 (二) 我们将一个新属性beencalled添加到对象f,因此现在'function'类没有定义此属性beencalled,我们说对象f是类“function”的对象?它有意义吗?f()仅在类型的实例中。FunctionType,实例可以有自己的属性 向实例添加属性不会影响其类,除非您已经重写了该类的\uuuu setattr\uuuu方法并在那里做了一些坏事 >

由于来自OOPS背景,从中看到下面的代码看起来很奇怪

我的问题:

(一) 根据上述代码,
f
是指向
类“函数”
的对象
f
的参考变量吗

(二) 我们将一个新属性
beencalled
添加到对象
f
,因此现在
'function'
类没有定义此属性
beencalled
,我们说对象
f
类“function”
的对象?它有意义吗?

f()
仅在
类型的实例中。FunctionType
,实例可以有自己的属性

向实例添加属性不会影响其类,除非您已经重写了该类的
\uuuu setattr\uuuu
方法并在那里做了一些坏事

>>> import types
>>> def func(): pass
>>> isinstance(func, types.FunctionType)
True
1) 是的:

Python在Python中比java或C++更灵活。对象可以具有未在其类中定义的属性,或者甚至缺少在其类中定义的属性!看看这个:

>>> class A:
def __init__(self, a):
    self.var = a


>>> obj = A(7)
>>> del obj.var #deletes the var attribute from obj, does not change the A class
>>> obj.var
Traceback (most recent call last):
  File "<pyshell#28>", line 1, in <module>
    obj.var
AttributeError: 'A' object has no attribute 'var'

>>> obj2 = A(6)
>>> obj2.var #obj2 is a new object, so the fact we deleted var from obj doesn't affect it
6 
>>A类:
定义初始化(self,a):
self.var=a
>>>obj=A(7)
>>>del obj.var#从obj中删除var属性,不更改A类
>>>obj.var
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
obj.var
AttributeError:“A”对象没有属性“var”
>>>obj2=A(6)
>>>obj2.var#obj2是一个新对象,因此我们从obj中删除var的事实并不影响它
6.
编辑:经过一点搜索,我找到了为什么选择这种行为的解释():

为了实现用户定义的对象,我选择了最简单的方法 设计一种方案,其中对象由一种新的 存储指向“类”的类引用的内置对象 同一类的所有实例共享的对象,以及一个字典, 命名为“实例字典”,其中包含实例 变量

在这个实现中,实例字典将包含 每个单独对象的实例变量,而类对象 将包含在同一类的所有实例之间共享的内容 特别是方法。在实现类对象时,我再次选择了 最简单的设计;类的方法集存储在 键为方法名的字典。我给这个班配音 词典为了支持继承,类对象还需要 存储对与基对象相对应的类对象的引用 上课。当时,我对课程相当幼稚,但我知道 关于最近被添加到C++中的多重继承。我 决定只要我支持继承,我就可以 我们支持简单的多重继承。因此 每个类对象都可以有一个或多个基类

在这个实现中,使用 对象实际上非常简单。无论何时更改 实例或类变量,这些更改只反映在 底层字典对象。例如,设置一个实例 实例上的变量更新其本地实例字典。 同样,在查找 对象,只需检查其实例字典是否存在 这个变量。如果在那里找不到变量,事情就会变得复杂 再有趣一点。在这种情况下,将在中执行查找 类字典,然后在类字典中的每个 基类


另一方面,您可以为自定义类更改此行为

class FooBar(object):
    __slots__ = ["foo","bar","baz"]
    # if you don't define __slots__, you can add attr to the object as needed
    # if you do, the object can only contain those attributes.
    def __init__(self,foo=None,bar=None,baz=None):
        self.foo = foo
        self.bar = bar
        self.baz = baz
    def __str__(self):
        return "I'm a FooBar with id {0} with foo: {1.foo}, bar: {1.bar}, baz: {1.baz}".format(id(self),self)

>>> a = FooBar("a","B","CCC")
>>> print(a)
I'm a FooBar with id 47260256 with foo: a, bar: B, baz: CCC
>>> a.spam = "eggs"
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    a.spam = "eggs"
AttributeError: 'FooBar' object has no attribute 'spam'

>>>def f():pass>>>键入(f)>>>我如何理解它?@Sham
f
是一个不带参数、不执行任何操作并返回
None
的函数。这个函数的类型是
@Sham了解什么?valek这样对象就可以有它的类一般不包含的proeprities?就这一点而言,还有额外的行为吗?哪个班没有?@Sham是的。它们也可能缺少类通常具有的属性!但是在java/c++中,我们与类和类实例这类概念联系在一起,这些范例在什么意义上是正确的?java不允许这样做this@ShamPython类在概念上遵循OOP,因为存在具有方法继承的类型层次结构。确实,更改属性集的能力可能会破坏多态性(如果超类的用户希望某个属性被子类删除),但请记住,强制属性也不能消除问题(请参阅)。程序员总是有责任决定何时以及如何使用语言功能来设计最实用和可理解的系统。@好吧,说对象不符合“类属性”是不准确的,因为实例属性不是类定义的一部分,它们只在方法中分配(主要是
\uuuu init\uuuu
)。而且正如您所知,方法是可以重写的。如果您仔细想想,静态类型语言中的情况并没有那么大的不同,因为内部字段通常是隐藏的,以支持getter和setter方法——并且没有什么可以阻止您确定某个属性在子类中无效,并重写getter方法nd setter抛出一个异常。@Sham我甚至一点也不理解你的问题……大多数情况下,你使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>来最小化内存占用。实现
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu所以我们可以向类的对象添加/删除属性,但在添加/删除属性之后,该对象仍将被称为该类的对象。
>>> class A: pass
>>> a = A()
>>> a.var = 7
>>> b = A()
>>> b.var
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
    b.newvar
AttributeError: 'A' object has no attribute 'var'
>>> class A:
def __init__(self, a):
    self.var = a


>>> obj = A(7)
>>> del obj.var #deletes the var attribute from obj, does not change the A class
>>> obj.var
Traceback (most recent call last):
  File "<pyshell#28>", line 1, in <module>
    obj.var
AttributeError: 'A' object has no attribute 'var'

>>> obj2 = A(6)
>>> obj2.var #obj2 is a new object, so the fact we deleted var from obj doesn't affect it
6 
class FooBar(object):
    __slots__ = ["foo","bar","baz"]
    # if you don't define __slots__, you can add attr to the object as needed
    # if you do, the object can only contain those attributes.
    def __init__(self,foo=None,bar=None,baz=None):
        self.foo = foo
        self.bar = bar
        self.baz = baz
    def __str__(self):
        return "I'm a FooBar with id {0} with foo: {1.foo}, bar: {1.bar}, baz: {1.baz}".format(id(self),self)

>>> a = FooBar("a","B","CCC")
>>> print(a)
I'm a FooBar with id 47260256 with foo: a, bar: B, baz: CCC
>>> a.spam = "eggs"
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    a.spam = "eggs"
AttributeError: 'FooBar' object has no attribute 'spam'
class BooFar(object):
    def __str__(self):
        return "I'm a BooFar with the following attributes:\n{}".format(self.__dict__)

>>> b = BooFar()
>>> print(b)
I'm a BooFar with the following attributes:
{}
>>> b.spam = "eggs"
>>> print(b)
I'm a BooFar with the following attributes:
{'spam': 'eggs'}