Python中的嵌套对象

时间:2015-06-12 13:38:34

标签: java python oop

我正在实现从Java到Python的移植。 现在,我想通过使用另一个对象作为嵌套属性来定义一个对象。

要明确,请考虑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中做同样的事情?

3 个答案:

答案 0 :(得分:7)

您的课程如下,请注意public vs private没有概念,所以您不需要设置器和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 @property decorators instead

答案 1 :(得分:2)

Python语法有点不同。如果你在深入研究之前先阅读一下,它将会有更多帮助。 您必须考虑的一些事项是:

  • 数据类型
  • 私人/公共领域/功能 - “建议”他们的pythonic方式
  • 括号,分号不算好

但这是一个演示:

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

答案 2 :(得分:1)

来自Python文档:

  

大多数Python代码都遵循一个约定:名称   带有下划线(例如_spam)的前缀应视为a   API的非公开部分(无论是函数,方法还是   数据成员)。

有关详细信息,请参阅: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"