标签: python-object

'super'对象没有属性'__eq__'

当我尝试覆盖魔术方法__eq__,并使用super访问找到的基本方法时object,我收到一个错误.这不是一个错误,但它确实感觉像一个:

class A(object):
    def __eq__(self, other):
        return super(A, self).__eq__(other)
A() == 0

# raises AttributeError: 'super' object has no attribute '__eq__'
Run Code Online (Sandbox Code Playgroud)

这是不直观的,因为object.__eq__存在,但class A(object): pass它没有.如果我没有错误__eq__地进行is检查,那么这可能是解决方法,但使用issuper不是mixin友好.在我的情况下,这条路线是可以的,但在其他情况下可能不是.

任何建议,或关于为什么这样__eq__工作的信息都会很棒.

python super python-2.7 python-object

11
推荐指数
1
解决办法
1538
查看次数

对象列表python

我试图打印一个包含列表作为属性的python对象列表,我有一些意想不到的结果:

这是我的代码:

class video(object):

    name = ''
    url = ''

class topic(object):

    topicName = ''
    listOfVideo = []

    def addVideo(self,videoToAdd):
        self.listOfVideo.append(videoToAdd)

    def getTopic(self):
        return self.topicName

    def getListOfVideo(self):
        return self.listOfVideo


topic1 = topic()
topic1.topicName = 'topic1'
video1 = video()
video1.name = 'VideoName1'
video1.url = 'VideoURL1'

video2 = video()
video2.name = 'VideoName2'
video2.url = 'VideoURL2'
topic1.addVideo(video1)
topic1.addVideo(video2)

topic2 = topic()
topic2.topicName = 'topic2'

video3 = video()
video3.name = 'VideoName3'
video3.url = 'VideoURL3'

video4 = video()
video4.name = 'VideoName4'
video4.url = 'VideoURL4'

topic2.addVideo(video3) …
Run Code Online (Sandbox Code Playgroud)

python python-object

9
推荐指数
1
解决办法
474
查看次数

如何在python中获取属性setter方法的属性

请考虑以下代码

class DataMember():
  def __init__(self, **args):
     self.default = {"required" : False , "type" : "string" , "length": -1}
     self.default.update(args)
  def __call__(self , func):
     #Here I want to set the attribute to method 
     setattr(func , "__dbattr__" , self.default)
     def validate(obj , value):
        #some other code
        func(obj , value)
     return validate
Run Code Online (Sandbox Code Playgroud)

这是我的装饰器方法来装饰其他类的属性的setter方法,我想为方法设置一些属性.但它不允许我.

我尝试如下

class User(DbObject):
  def __init__(self):
      super(User , self)
      self._username = None
  @property
  def Name(self):
      return self._username

  @Name.setter
  @DataMember(length=100)
  def Name(self , value):
      self._username = value

 u = User()
 u.Name = …
Run Code Online (Sandbox Code Playgroud)

python python-2.7 python-3.x python-decorators python-object

7
推荐指数
1
解决办法
244
查看次数

我可以在构造函数方法之外声明 Python 类字段吗?

我绝对是 Python 新手(我来自 Java),我对类字段有以下疑问。

考虑这样的代码:

class Toy():
    def __init__(self, color, age):
        self.color = color
        self.age = age

action_figure = Toy('red', 10)
Run Code Online (Sandbox Code Playgroud)

好的,做了什么很清楚而且很简单:

它正在定义一个玩具类。在构造方法中定义了两个字段以及如何设置字段值。最后(在“main”中)它创建了一个新的Toy实例,在构造函数调用中传递该字段的值。

好的,明白了……但我有疑问。在 Java 中定义相同的类我做这样的事情:

public class Toy {
    private String color;
    private int age;

    // CONSTRUCTOR:
    public Dog(String color, int age) {
        this.color = color;
        this.age = age;
    }
}
Run Code Online (Sandbox Code Playgroud)

好吧,它很相似,但我发现了一个很大的区别。在我的 Java conde 中,我将类字段声明为我的构造函数方法之外的变量。在 Python 中,我直接在构造函数方法中定义类字段。所以这意味着在 Java 中我可以声明 n 个类字段并使用构造函数方法只初始化这个字段的一个子集,例如这样的:

public class Toy {
    private String color;
    private int age;
    private String field3;
    private …
Run Code Online (Sandbox Code Playgroud)

python python-3.x python-object

7
推荐指数
2
解决办法
8287
查看次数

以声明方式设置类__name__

为什么不能以声明方式覆盖类名,例如使用不是有效标识符的类名?

>>> class Potato:
...     __name__ = 'not Potato'
...     
>>> Potato.__name__  # doesn't stick
'Potato'
>>> Potato().__name__  # .. but it's in the dict
'not Potato'
Run Code Online (Sandbox Code Playgroud)

我想也许这只是在类定义块完成后被覆盖的情况.但似乎这不是真的,因为名称是可写的,但显然没有在类dict中设置:

>>> Potato.__name__ = 'no really, not Potato'
>>> Potato.__name__  # works
'no really, not Potato'
>>> Potato().__name__  # but instances resolve it somewhere else
'not Potato'
>>> Potato.__dict__
mappingproxy({'__module__': '__main__',
              '__name__': 'not Potato',  # <--- setattr didn't change that
              '__dict__': <attribute '__dict__' of 'no really, not Potato' objects>,
              '__weakref__': <attribute …
Run Code Online (Sandbox Code Playgroud)

python metaclass python-datamodel python-descriptors python-object

6
推荐指数
1
解决办法
586
查看次数

Python 多处理为每个进程创建相同的对象实例

我写了一个简单的例子来说明我到底在想什么。可能有一些非常简单的解释我只是错过了。

import time
import multiprocessing as mp
import os


class SomeOtherClass:
    def __init__(self):
        self.a = 'b'


class SomeProcessor(mp.Process):
    def __init__(self, queue):
        super().__init__()
        self.queue = queue

    def run(self):
        soc = SomeOtherClass()
        print("PID: ", os.getpid())
        print(soc)

if __name__ == "__main__":
    queue = mp.Queue()

    for n in range(10):
        queue.put(n)

    processes = []

    for proc in range(mp.cpu_count()):
        p = SomeProcessor(queue)
        p.start()
        processes.append(p)

    for p in processes:
        p.join()
Run Code Online (Sandbox Code Playgroud)

结果是:

PID: 11853
<__main__.SomeOtherClass object at 0x7fa637d3f588>
PID: 11854
<__main__.SomeOtherClass object at 0x7fa637d3f588>
PID: 11855
<__main__.SomeOtherClass object …
Run Code Online (Sandbox Code Playgroud)

python multiprocessing python-multiprocessing python-object

5
推荐指数
1
解决办法
1644
查看次数

如何在python中验证类属性?

我一直在尝试验证用户可以在框架样式设置中创建的类。我可以通过以下方式确保子类中存在类属性:

from abc import ABC, abstractmethod

class A(ABC):
    @property
    @classmethod
    @abstractmethod
    def s(self):
        raise NotImplementedError

class ClassFromA(A):
    pass


ClassFromA()
Run Code Online (Sandbox Code Playgroud)

这导致以下情况Exception

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class ClassFromA with abstract methods s
Run Code Online (Sandbox Code Playgroud)

我还可以s在创建类时使用装饰器检查类属性的类型,如下所示:

from abc import ABC, abstractmethod

def validate_class_s(cls):
    if not isinstance(cls.s, int):
        raise ValueError("S NOT INT!!!")
    return cls

class A(ABC):
    @property
    @classmethod
    @abstractmethod
    def s(self):
        raise NotImplementedError

@validate_class_s
class ClassFromA(A):
    s = 'a string'
Run Code Online (Sandbox Code Playgroud)

导致: …

python metaclass python-3.x python-object

3
推荐指数
1
解决办法
518
查看次数

将对象的Unicode表示形式返回到对象中(在python中)

仅供参考 - 这是程序使用Django但我没有标记它因为它不是django问题.django代码在这里用于上下文

~~背景~~

我发现了一个程序中的错误.简而言之,我urlparse.urlparse用来从给定的URI获取信息并将其保存到数据库中.

目标是做这样的事情:

url = urlparse.urlparse('http://somedomain.com/yada/yada')
some_instance = Domain(address=url.netloc)
Run Code Online (Sandbox Code Playgroud)

~~问题~~

问题是由于编码错误,数据库充满了urlparse对象.因此,从数据库中调用实例时,结果是一个unicode字符串:

some_instance = Domain.objects.get(pk=XX)
some_instance.address
>>> u"ParseResult(scheme=u'http', netloc=u'www.somedomain.com', path=u'/', params='', query=u'_vsrefdom=googleppc', fragment='')"
Run Code Online (Sandbox Code Playgroud)

哎呀.

~~问题~~

显然,我需要回去修复一些记录.我很想知道的是,是否有一种好的pythonic方法可以将对象的unicode表示(而不是实际.__unicode__()返回)恢复回对象本身.

思考?

我在谷歌和StackOverflow上看了一下,问题是我遇到的任何搜索与输出的交易.__unicode__()而不是整个表示本身.

python unicode urlparse python-object

1
推荐指数
1
解决办法
30
查看次数

如何求和对象的所有实例的属性

我想对一个对象的所有实例的 costsum 属性求和。

class ActivityCenter:

    def __init__(self, costpool, costsum, costdriver, cdunits):
        self.costpool = costpool
        self.costsum = costsum
        self.costdriver = costdriver
        self.cdunits = cdunits

cp1 = ActivityCenter("Material Handling", 480000, "Pounds", 160000)
cp2 = ActivityCenter("Production orders", 90000, "Num of POs", 200)

# I am looking to add up the costsum values for all instances, similar to:
costsumtotal = (cp1.__dict__.get("costsum")) + (cp2.__dict__.get("costsum"))
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经尝试使用 sum() 进行如下理解,参考这个解决方案

B = []
for i in range(10):
    B.append(ActivityCenter())

s = sum(i.costsum for i in B)
Run Code Online (Sandbox Code Playgroud)

但是我无法克服缺少 …

python python-3.x python-object

1
推荐指数
1
解决办法
2813
查看次数

为什么在python类中设置方法在调用时不会传递self?

如果我这样写:

class A:
    def a(self):
        return 2
    def b(self):
        print(self.a())

e = A()

def xa(self):
    return 3 

e.a = xa
e.b()
Run Code Online (Sandbox Code Playgroud)

会爆炸说:

TypeError: xa() missing 1 required positional argument: 'self'
Run Code Online (Sandbox Code Playgroud)

为什么会这样?(如果xa没有参数,那么它可以工作,打印3,但是我无法访问self)。

这是出于测试目的,而不是实际的生产代码

python python-object

1
推荐指数
1
解决办法
33
查看次数