很简单,我正在学习Python,我找不到一个可以告诉我如何编写以下内容的引用:
public class Team {
private String name;
private String logo;
private int members;
public Team(){}
// Getters/setters
}
稍后:
Team team = new Team();
team.setName("Oscar");
team.setLogo("http://....");
team.setMembers(10);
这是一个具有以下属性的类团队:name/logo/members
编辑
经过几次尝试,我得到了这个:
class Team:
pass
以后
team = Team()
team.name = "Oscar"
team.logo = "http://..."
team.members = 10
这是Python的方式吗?感觉很奇怪(当然是来自强类型语言)。
以下是我的建议:
关于此的一些注释:
我声明
Team
继承自object
。这使Team成为一个“新样式的类”;自从在Python 2.2中引入以来,这一直是Python中推荐的实践。(在Python3.0及更高版本中,即使不使用(object)
符号,类始终是“新样式”;但是使用该符号不会造成损害,并且会使继承变得明确。)下面是新样式类的StackOverflow discussion。这不是必需的,但是我让初始化器采用可选参数,以便您可以在一行初始化实例,就像我对
team
和team3
所做的那样。这些参数是命名的,因此您可以提供值作为位置参数(如使用team
),也可以使用argument=
形式,如我使用team3
一样。当显式指定参数的名称时,可以按任意顺序指定参数。如果需要getter和setter函数,也许是为了检查某些东西,那么在Python中可以声明特殊的方法函数。这就是马丁·洛维斯所说的“财产描述者”的意思。在Python中,通常认为良好的做法是简单地分配给成员变量,并简单地引用它们来获取它们,因为如果需要,以后总是可以添加属性描述符。(如果您不需要它们,那么您的代码就不会那么混乱,也不会花太多时间编写。奖金!)
这里有一个关于属性描述符的好链接:http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/
如果在调用
Team()
时指定值,或者稍后将它们插入到类实例中,这并不重要。你最终得到的类实例将是相同的。上面将打印
True
。(您可以很容易地为Team
实例重载==
运算符,并使Python在您说team == team2
时做正确的事情,但这在默认情况下不会发生。)编辑:我在上面的答案中漏掉了一件事,现在我想补充一下。如果对
__init__()
函数执行可选参数操作,那么如果要将“可变”作为可选参数提供,则需要小心。整数和字符串是“不可变的”。您永远无法在适当的地方更改它们;相反,Python会创建一个新对象并替换以前的对象。
列表和字典是“可变的”。你可以永远保留同一个对象,添加和删除它。
您需要知道的关键一点是:编译函数时,可选参数只计算一次。因此,如果在类的
__init__()
中将可变参数作为可选参数传递,则类的每个实例共享一个可变对象。这几乎不是你想要的。解决方法非常简单:
使用默认参数值
None
,然后测试参数是否通过is None
,是否符合Python设计模式的条件,或者至少是您应该掌握的习惯用法。编写类通常是
要实例化类的实例
也可以设置默认值
要像这样实例化类集,您需要做的是
您会注意到,这个方法与典型的python字典交互有很多相似之处
在Python中,通常不编写getter和setter,除非您真的有一个非常重要的实现(此时您使用属性描述符)。
相关问题 更多 >
编程相关推荐