【问题标题】:python - another class inside constructorpython - 构造函数中的另一个类
【发布时间】:2013-05-10 11:36:55
【问题描述】:

我是 Python 新手,我很难理解如何在 Python 中执行以下操作(例如,我将如何在 Java 中执行)

class Person{ 
 private String name;
 private Address address; 
 public Person(String xyz, Address a) {
    this.name = xyz;
    this.address = a;
}

 .... 
}

【问题讨论】:

    标签: java python class object constructor


    【解决方案1】:

    我不知道你为什么认为构造函数内部还有另一个类,但上面的 Java 在 Python 中可能看起来像这样:

    class Person (object):
        def __init__ (self, xyz, a):
            self.name = xyz
            self.address = a
    

    作为一种动态类型语言,Python 在编译代码时不需要知道类型是什么样的。相反,它动态创建对象,并在需要时添加属性。这不仅允许您在初始化程序中添加之前未声明的实例字段,还允许您在创建对象后添加内容:

    x = Person("poke", "My address")
    x.phoneNumber = "012345679"
    

    【讨论】:

    • 不确定构造函数中的另一个类是什么意思 - 所以 python 不需要知道构造函数时对象是什么样的?
    • @kkudi Python 是一种动态类型语言,您甚至可以在创建对象后添加内容:x = Person() 然后x.something = 'Foo'
    【解决方案2】:

    就像@poke 提到的,你可以这样做:

    class Person (object):
        def __init__ (self, xyz, a):
           self.name = xyz
           self.address = a
    

    如果你的意思是也有默认构造函数,那么你可以有类似的东西:

    class Person (object):
        def __init__ (self, xyz=None, a=None):
           self.name = xyz
           self.address = a
    

    这将允许您在没有参数的情况下调用构造函数。

    你可以使用构造函数:

    p = Person("yadda","bla")
    

    p = Person()
    

    【讨论】:

      【解决方案3】:

      类似这样的:

      class Person(object):
          def __init__(self, xyz, a):
              self.name = xyz
              self.address = a
          # ...
      

      现在,你当然可以在构造函数中定义一个新类:

      class Person(object):
          def __init__(self, xyz, a):
              self.name = xyz
              self.address = a
              class Glass(object):
                  def __init__(self):
                      self.glass_name = xyz
                      #... whatever - but what purpose would this serve?
          # ...
      

      【讨论】:

        【解决方案4】:

        Python 并没有真正的private 变量,在成员访问方面每个人都被视为成年人,但是无论如何你最终可能会实现getter / setter 方法。请注意,_ 变量名称前缀只是 "private" 变量的 PEP-8 命名约定,尽管它实际上并没有停止对它们的访问。

        class Person(object): # subclass object for a new-style class
            def __init__(self, name, address):
                self._name = name
                self._address = address
        
            @property
            def name(self):
                return self._name
        
            @name.setter
            def name(self, name):
                self._name = name
        
            @property
            def address(self):
                return self._address
        
            @address.setter
            def address(self, address):
                self._address = address
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-22
          • 2014-03-12
          • 2014-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-07
          相关资源
          最近更新 更多