我正在实现从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中做同样的事情?
答案 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语法有点不同。如果你在深入研究之前先阅读一下,它将会有更多帮助。 您必须考虑的一些事项是:
但这是一个演示:
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"