gpt4 book ai didi

python - 如何在 Python 中定义一个类?

转载 作者:IT老高 更新时间:2023-10-28 20:27:57 26 4
gpt4 key购买 nike

很简单,我正在学习 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);

这是一个具有以下属性的类团队:名称/ Logo /成员

编辑

经过几次尝试,我得到了这个:

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)

对此的一些说明:

  1. 我声明 Team 继承自 object。这使得Team成为一个“新式类”;自从它在 Python 2.2 中引入以来,这一直是 Python 中的推荐做法。 (在 Python 3.0 及更高版本中,即使您省略了 (object) 表示法,类也始终是“新式”;但使用该表示法并没有什么害处,并且使继承变得显式。)这是一个堆栈溢出 discussion新型类。

  2. 这不是必需的,但我让初始化程序采用可选参数,以便您可以在一行上初始化实例,就像我对 teamteam3 所做的那样.这些参数是命名的,因此您可以提供值作为位置参数(与 team 一样),也可以使用 argument= 形式,就像我对 team3< 所做的那样。显式指定参数名称时,可以按任意顺序指定参数。

  3. 如果你需要 getter 和 setter 函数,也许是为了检查一些东西,在 Python 中你可以声明特殊的方法函数。这就是 Martin v. Löwis 在说“属性(property)描述符”时的意思。在 Python 中,通常认为简单地分配给成员变量并简单地引用它们以获取它们是一种很好的做法,因为您可以随时在以后需要时添加属性描述符。 (如果您从不需要它们,那么您的代码就不会那么困惑,并且花费您更少的时间来编写。奖金!)

这里有一个关于属性描述符的好链接:http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/

注意:Adam Gomaa 的博客似乎已从网络上消失。这是 archive.org 上已保存副本的链接:

https://web.archive.org/web/20160407103752/http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/

  1. 如果您指定值作为调用 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,然后测试传递的参数是None,这符合Python设计模式,或者至少是你的习惯用法应该掌握。

关于python - 如何在 Python 中定义一个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1495666/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com