Python中的嵌套对象

2024-09-27 21:26:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在实现从Java到Python的移植。 现在,我想用另一个对象作为neested属性来定义一个对象。你知道吗

需要说明的是,考虑Java代码如下:

public class Foo {

    private String fooName;

    public Foo(String fooName) {
        setFooName(fooName);
    }

    public void setFooName(String fooName) {
        this.fooName = fooName;
    }

    public String getFooName() {
        return this.fooName;
    }

}

public class Bar {

    private String barName;
    private Foo foo;

    public Bar(String barName, Foo foo) {
        setBoName(fooName);
        setFoo(foo);
    }

    public void setBarName(String barName) {
        this.barName = barName;
    }

    public String getBarName() {
        return this.barName;
    }

    public void setFoo(Foo foo) {
        this.foo = foo;
    }

    public Foo getFoo() {
        return this.foo;
    }

}

我怎样才能在Python中做同样的事情呢?你知道吗


Tags: 对象stringreturnfoobarjavaprivatepublic
3条回答

您的类如下所示,注意没有publicprivate的概念,因此您不需要setter和getter

class Foo:
    def __init__(self, fooName):
        self.fooName = fooName

class Bar:
    def __init__(self, barName, foo):
        self.barName = barName
        self.foo = foo

举个例子

>>> f = Foo('bob')
>>> b = Bar('steve', f)
>>> f.fooName
'bob'
>>> b.barName
'steve'
>>> b.foo
<__main__.Foo object at 0x02F93070>
>>> b.foo.fooName
'bob'

我想再次强调,一般使用setter和getter并不被认为是Pythonic。要么不要编写/使用它们,要么如果需要的话,use ^{} decorators instead

Python语法有点不同。如果你在深入研究之前先读一读,会有更大的帮助。 您必须考虑以下几点:

  • 数据类型
  • 私有/公共字段/函数-暗示它们的python方式
  • 括号、分号不算好

但这里有一个演示:

class Foo(object):
    def __init__(self, fooName):
        self.setFooName(fooName)

    def setFooName(self, fooName):
        self._fooName = fooName

    def getFooName(self):
        return self._fooName

class Bar(object):
    def __init__(self, barName, foo):
        self.setBoName(fooName)
        self.setFoo(foo)

    def setBarName(self, barName):
        self._barName = barName

    def getBarName(self):
        return self._barName

    def setFoo(self, foo):
        self._foo = foo

    def getFoo(self):
        return self._foo

从Python文档中:

There is a convention that is followed by most Python codes: a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member).

有关详细信息,请参见:https://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references。你知道吗

由于基于Java的类通常“隐藏”它们的字段(通过使其私有化),并为这些字段提供公共getter/setter,因此可以使用该约定在Python中实现这一点:

class Foo(object):

    def __init__ (self, fooName):
        self.setFooName(fooName)


    def setFooName(self, fooName):
        self.__fooName = fooName


    def getFooName():
        return self.__fooName;


class Bar(object) :

    def __init__(self, barName, foo) :
        self.setBarName(barName)
        self.setFoo(foo)


    def setBarName(self, barName) :
        self.__barName = barName


    def getBarName(self) :
        return self.__barName

    def setFoo(self, foo) :
        self.__foo = foo;


    def getFoo(self) :
        return self.__foo;


foo = Foo("foo")
bar = Bar("bar", foo)

print bar.getBarName()
print type(bar.getFoo())
# print bar.__barName -> this will return error as the variable is considered "private"

相关问题 更多 >

    热门问题