当我尝试覆盖魔术方法__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检查,那么这可能是解决方法,但使用is而super不是mixin友好.在我的情况下,这条路线是可以的,但在其他情况下可能不是.
任何建议,或关于为什么这样__eq__工作的信息都会很棒.
我试图打印一个包含列表作为属性的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) 请考虑以下代码
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
我绝对是 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) 为什么不能以声明方式覆盖类名,例如使用不是有效标识符的类名?
>>> 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
我写了一个简单的例子来说明我到底在想什么。可能有一些非常简单的解释我只是错过了。
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) 我一直在尝试验证用户可以在框架样式设置中创建的类。我可以通过以下方式确保子类中存在类属性:
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)
导致: …
仅供参考 - 这是程序使用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__()而不是整个表示本身.
我想对一个对象的所有实例的 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)
但是我无法克服缺少 …
如果我这样写:
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 ×10
python-object ×10
python-3.x ×4
metaclass ×2
python-2.7 ×2
super ×1
unicode ×1
urlparse ×1