定义Python类

5 c# python

我正在尝试自己学习Python,因此,我得到了一个用C#编写的软件,并试图用Python重新编写它.鉴于以下课程,我有几个问题:

C#

sealed class Message
{
    private int messageID;
    private string message;
    private ConcurrentBag <Employee> messageFor;
    private Person messageFrom;
    private string calltype;
    private string time;


    public Message(int iden,string message, Person messageFrom, string calltype,string time)
    {
        this.MessageIdentification = iden;
        this.messageFor = new ConcurrentBag<Employee>();
        this.Note = message;
        this.MessageFrom = messageFrom;
        this.CallType = calltype;
        this.MessageTime = time;
    }

    public ICollection<Employee> ReturnMessageFor
    {
        get
        {
            return messageFor.ToArray();
        }

    }
Run Code Online (Sandbox Code Playgroud)
  1. 在我的类中,我有一个名为messageFor的线程安全集合,在Python中是否存在等价物?如果是这样,我如何在python类中实现它?

  2. 我的线程安全集合也有一个吸气剂?我如何在Python中做同样的事情?

  3. Python有一个EqualsTo方法来测试对象之间的相等性吗?或者相当于Python中的这个?

        public override bool Equals(object obj)
        {
            if (obj == null)
            {
                return false;
            }
    
            Message testEquals = obj as Message;
    
            if((System.Object)testEquals == null)
            {
                return false;
            }
    
            return (this.messageID == testEquals.messageID) && (this.message == testEquals.message) && (this.messageFor == testEquals.messageFor) && (this.messageFrom == testEquals.messageFrom) && (this.calltype == testEquals.calltype);
    
        }
    
        public bool Equals(Message p)
        {
            if ((Object)p == null)
            {
                return false;
            }
    
            return (this.messageID == p.messageID) && (this.message == p.message) && (this.messageFor == p.messageFor) && (this.messageFrom == p.messageFrom) && (this.calltype == p.calltype);
    
        }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 你能把它密封起来,以致没有人可以继承吗?

到目前为止我得到了什么:

class Message:


   def __init__(self, messageID, message, callType):

      self.messageID = messageID
      self.message = message
      self.callType = callType
Run Code Online (Sandbox Code Playgroud)

Kev*_*vin 4

在我的类中,我有一个名为 messageFor 的线程安全集合,Python 中是否有等效的集合?如果是这样,我如何在 python 类中实现它?

一般来说,CPython 的全局解释器锁可以防止由于同时访问/修改而导致的崩溃,因为您根本无法实现真正​​的同时评估。因此,普通列表可能是合适的,或者您可能需要一个队列来防止更高级别的竞争条件。有关详细信息,请参阅列表是否是线程安全的。

我的线程安全集合也有一个吸气剂?我该如何在 Python 中做同样的事情呢?

您可以使用装饰器模拟 C# getter/setter 的行为@property。有关详细信息,请参阅Python @property 与 getter 和 setter 。

Python 有 EqualsTo 方法来测试对象之间的相等性吗?或者Python 中的等价物?

您可以使用该__eq__方法定义相等行为。例如,您的代码可能会转换为以下内容:

class Thing:
    #other methods go here...
    def __eq__(self, other):
        if not isinstance(other, Thing):
            return False
        return self.messageID == other.messageID and self.message == other.message #and... etc
Run Code Online (Sandbox Code Playgroud)

能不能把它封印起来,不让任何人继承?

据我所知,这是不可能的。Python 通常遵循“我们都是成年人”的理念。如果编码员想要从类继承或访问对象的属性,那么他们可以;您能做的最好的事情就是给出一个严厉的建议,不要在文档中这样做(或者在“私有”属性的名称损坏的情况下设置小的减速带)。