[英]How can I define a class in Python?
很简单,我正在学习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);
这是一个具有以下属性的类 Team:名称/徽标/成员
编辑
经过几次尝试,我得到了这个:
class Team:
pass
之后
team = Team()
team.name = "Oscar"
team.logo = "http://..."
team.members = 10
这是 Python 的方式吗? 感觉很奇怪(当然来自强类型语言)。
以下是我的建议:
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
。 这使得 Team 成为一个“新式班级”; 自 Python 2.2 引入以来,这一直是 Python 中的推荐做法。 (在 Python 3.0 及更高版本中,即使您省略了(object)
表示法,类也始终是“新式”的;但使用该表示法并没有什么害处,并使继承变得明确。)这是关于新式类的 Stack Overflow 讨论.
这不是必需的,但我让初始化程序采用可选参数,以便您可以在一行上初始化实例,就像我对team
和team3
。 这些参数是命名的,因此您可以提供值作为位置参数(与team
),或者您可以使用argument=
形式,就像我对team3
所做的team3
。 当您明确指定参数的名称时,您可以按任意顺序指定参数。
如果你需要 getter 和 setter 函数,也许是为了检查一些东西,在 Python 中你可以声明特殊的方法函数。 这就是 Martin v. Löwis 所说的“财产描述词”的意思。 在 Python 中,简单地分配给成员变量,然后简单地引用它们来获取它们,通常被认为是一种很好的做法,因为如果您需要它们,您可以随时添加属性描述符。 (如果您永远不需要它们,那么您的代码就不会那么杂乱,并且花费的时间也更少。奖金!)
这是关于属性描述符的一个很好的链接: http : //adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/
注意:Adam Gomaa 的博客似乎从网络上消失了。 这是在 archive.org 上保存的副本的链接:
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 the provided list
k0 = K()
k1 = K()
k0.lst.append(1)
print(k0.lst) # prints "[1]"
print(k1.lst) # prints "[]"
这种使用默认参数值None
,然后测试传递的参数is None
,符合 Python 设计模式,或者至少是您应该掌握的习语。
class Team:
def __init__(self):
self.name = None
self.logo = None
self.members = 0
在 Python 中,您通常不会编写 getter 和 setter,除非您确实对它们有一个重要的实现(此时您使用属性描述符)。
要编写类,您通常会执行以下操作:
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 字典交互有很多相似之处。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.