python中怎么定义类_如何在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中推荐的实践。(在Python3.0及更高版本中,即使不使用(object)符号,类始终是“新样式”;但是使用该符号不会造成损害,并且会使继承变得明确。)下面是新样式类的StackOverflow discussion。

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

如果需要getter和setter函数,也许是为了检查某些东西,那么在Python中可以声明特殊的方法函数。这就是马丁·洛维斯所说的“财产描述者”的意思。在Python中,通常认为良好的做法是简单地分配给成员变量,并简单地引用它们来获取它们,因为如果需要,以后总是可以添加属性描述符。(如果您不需要它们,那么您的代码就不会那么混乱,也不会花太多时间编写。奖金!)

如果在调用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实例重载==运算符,并使Python在您说team == team2时做正确的事情,但这在默认情况下不会发生。)

编辑:我在上面的答案中漏掉了一件事,现在我想补充一下。如果对__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设计模式的条件,或者至少是您应该掌握的习惯用法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值