__slots__Python中的目的是什么- 特别是关于我何时想要使用它,何时不想使用它?
可能重复:
类__init __()函数内部和外部的变量
我注意到在Python中,人们以两种不同的方式初始化他们的类属性.
第一种方式是这样的:
class MyClass:
__element1 = 123
__element2 = "this is Africa"
def __init__(self):
#pass or something else
Run Code Online (Sandbox Code Playgroud)
另一种风格如下:
class MyClass:
def __init__(self):
self.__element1 = 123
self.__element2 = "this is Africa"
Run Code Online (Sandbox Code Playgroud)
哪个是初始化类属性的正确方法?
我正在尝试创建类实例的JSON字符串表示并且有困难.假设这个类是这样构建的:
class testclass:
value1 = "a"
value2 = "b"
Run Code Online (Sandbox Code Playgroud)
对json.dumps的调用是这样的:
t = testclass()
json.dumps(t)
Run Code Online (Sandbox Code Playgroud)
它失败并且告诉我测试类不是JSON可序列化的.
TypeError: <__main__.testclass object at 0x000000000227A400> is not JSON serializable
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用pickle模块:
t = testclass()
print(pickle.dumps(t, pickle.HIGHEST_PROTOCOL))
Run Code Online (Sandbox Code Playgroud)
它提供类实例信息,但不提供类实例的序列化内容.
b'\x80\x03c__main__\ntestclass\nq\x00)\x81q\x01}q\x02b.'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
这样做有什么区别
class a:
def __init__(self):
self.val=1
Run Code Online (Sandbox Code Playgroud)
去做
class a:
val=1
def __init__(self):
pass
Run Code Online (Sandbox Code Playgroud) 我正在学习这个,这是为了理解类的属性.但与以下代码片段的输出混淆.
class A:
aliases = None
name = None
def __init__(self,name):
self.name = name
self.aliases = set([name])
def add_aliases(self,a):
self.aliases.add(a)
def __repr__(self):
return str(self.name) + str(self.aliases)
arr = []
for i in range(3):
arr.append(A(i))
arr[-1].add_aliases(i+1)
for item in arr:
print item
A.aliases = set([]) ##Modify the static element of class
for item in arr:
print item
Run Code Online (Sandbox Code Playgroud)
Python解释器:2.7.9
输出是
0set([0, 1])
1set([1, 2])
2set([2, 3])
0set([0, 1])
1set([1, 2])
2set([2, 3])
Run Code Online (Sandbox Code Playgroud)
我期待这样的东西作为输出.
0set([2, 3])
1set([2, 3])
2set([2, …Run Code Online (Sandbox Code Playgroud) 我正在编写一个应用程序来收集UDP消息并每1秒处理一次.
应用程序原型如下:
from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor
import threading
import time
class UdpListener(DatagramProtocol):
messages = []
def datagramReceived(self, data, (host, port)):
self.messages.append(data)
class Messenger(threading.Thread):
listener = None
def __init__(self):
threading.Thread.__init__(self)
def run(self):
while True:
time.sleep(1)
recivedMessages = self.listener.messages
length = len(recivedMessages)
messagesToProccess = recivedMessages[0:length]
#doSomethingWithMessages(messagesToProccess)
del self.listener.messages[0:length]
print(length)
listener = UdpListener()
messenger = Messenger()
messenger.listener = listener
messenger.start()
reactor.listenUDP(5556, listener)
reactor.run()
Run Code Online (Sandbox Code Playgroud)
我不确定我是否可以轻松地从列表中删除起始值(del self.listener.messages [0:length]),而不会有任何传入消息更改列表和应用程序崩溃的风险.
更新 - 带锁的版本
class Messenger(threading.Thread):
listener = None
lock = threading.Lock()
def __init__(self): …Run Code Online (Sandbox Code Playgroud)