非常简单,我正在学习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);
这是具有以下属性的班级团队:名称/徽标/成员
编辑
经过几次尝试,我得到了:
class Team:
pass
稍后
team = Team()
team.name = "Oscar"
team.logo = "http://..."
team.members = 10
这是Python方式吗?感觉很奇怪(当然是来自强类型语言)。
class Team:
def __init__(self):
self.name = None
self.logo = None
self.members = 0
在Python中,通常不会编写getter和setter,除非您确实对它们有一个简单的实现(此时使用属性描述符)。
这是我的建议:
class Team(object):
def __init__(self, name=None, logo=None, members=0):
self.name = name
self.logo = logo
self.members = members
team = Team("Oscar", "http://...", 10)
team2 = Team()
team2.name = "Fred"
team3 = Team(name="Joe", members=10)
一些注意事项:
我声明Team
继承自object
。这使团队成为“新型班级”;自从Python 2.2引入以来,建议在Python中推荐这种做法。 (在Python 3.0及更高版本中,即使不使用(object)
表示法,类也始终是“新样式”;但是使用该表示法没有任何危害,并且使继承明确。)这是新样式的StackOverflow discussion类。
这不是必需的,但是我使初始化程序带有可选参数,以便您可以像在team
和team3
上所做的那样在一行上初始化实例。这些参数已命名,因此您可以提供值作为位置参数(例如team
),也可以像使用argument=
一样使用team3
形式。当您明确指定参数名称时,可以按任何顺序指定参数。
如果需要使用getter和setter函数,也许要检查某些内容,可以在Python中声明特殊的方法函数。这就是马丁诉洛维斯(Martin v。Löwis)说“财产描述符”时的意思。在Python中,通常简单地分配给成员变量,然后简单地引用它们以获取它们是一种好习惯,因为您可以随时在需要时添加属性描述符。 (而且,如果您从不需要它们,那么您的代码就不会太混乱,花更少的时间来编写。奖金!)
这里是关于属性描述符的很好的链接: http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/
如果在调用Team()
的过程中指定值或以后将其戳到类实例中,都没有关系。您最终得到的最终类实例将是相同的。
team = Team("Joe", "http://example.com", 1)
team2 = Team()
team2.name = "Joe"
team2.logo = "http://example.com"
team2.members = 1
print team.__dict__ == team2.__dict__
以上将打印True
。 (您可以轻松地为==
实例重载Team
运算符,并在说team == team2
时让Python做正确的事,但是默认情况下不会发生这种情况。)
编辑:我在上面的答案中遗漏了一件事,现在我想添加它。如果在__init__()
函数上执行可选参数操作,则要提供“可变”作为可选参数,则需要格外小心。
整数和字符串是“不可变的”。您永远无法将它们更改到位。相反,发生的事情是Python创建了一个新对象并替换了您以前拥有的对象。
列表和字典是“可变的”。您可以将同一对象永久保留,对其进行添加和删除。
x = 3 # the name "x" is bound to an integer object with value 3
x += 1 # the name "x" is rebound to a different integer object with value 4
x = [] # the name "x" is bound to an empty list object
x.append(1) # the 1 is appended to the same list x already had
您需要知道的关键事项:编译函数时,可选参数仅计算一次。因此,如果您在类的__init__()
中将可变变量作为可选参数传递,则该类的每个实例都共享一个可变对象。这几乎永远不是您想要的。
class K(object):
def __init__(self, lst=[]):
self.lst = lst
k0 = K()
k1 = K()
k0.lst.append(1)
print k0.lst # prints "[1]"
print k1.lst # also prints "[1]"
k1.lst.append(2)
print k0.lst # prints "[1, 2]"
解决方案非常简单:
class K(object):
def __init__(self, lst=None):
if lst is None:
self.lst = [] # bind lst with a new, empty list
else:
self.lst = lst # bind lst with provided list
k0 = K()
k1 = K()
k0.lst.append(1)
print k0.lst # prints "[1]"
print k1.lst # print "[]"
使用默认参数值None
,然后测试参数是否通过is None
,是否符合Python设计模式或至少您应该掌握的习惯用法,这项工作。
编写类通常需要做的是
class Person:
def __init__(self, name, age, height):
self.name = name
self.age = age
self.height = height
要实例化一个类的实例,请执行
person1 = Person("Oscar", 40, "6ft")
person2 = Team("Danny", 12, "5.2ft")
您也可以设置默认值
class Person:
def __init__(self):
self.name = "Daphne"
self.age = 20
self.height = "5.4ft"
要实例化这样设置的类,您想要做的是
person3 = Person()
person3.name = "Joe"
person3.age = 23
person3.height = "5.11ft"
您会注意到此方法与典型的python字典交互有很多相似之处