相关疑难解决方法(0)

__slots__的用法?

__slots__Python中的目的是什么- 特别是关于我何时想要使用它,何时不想使用它?

python oop slots python-internals

697
推荐指数
10
解决办法
18万
查看次数

在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)

哪个是初始化类属性的正确方法?

python attributes class

231
推荐指数
2
解决办法
28万
查看次数

将类实例序列化为JSON

我正在尝试创建类实例的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)

我究竟做错了什么?

python serialization json pickle

160
推荐指数
10
解决办法
25万
查看次数

6
推荐指数
3
解决办法
496
查看次数

Python类中的类属性阴影

我正在学习这个,这是为了理解类的属性.但与以下代码片段的输出混淆.

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)

python

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

这个python代码线程是否安全(带扭曲的线程)?

我正在编写一个应用程序来收集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)

python multithreading udp twisted

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