2012-12-06 113 views
2

我想弄清楚一个非常简单的问题,但仍然无法完全理解班级的工作方式。例如,如果我想用名为“name”的属性创建一个名为“Friend”的类,这是否意味着我必须在其他任何东西之前给一个名为“name”的变量?那么我怎样才能定义构造函数来允许“名称”的规范?这段代码是废话吗?在此先感谢您的任何回应班级的工作方式

class Friend: 

    def __init__(self,name): 
     self.set_name(name) 


    def set_name(self,name): 
     self.name=name 

    def get_name(self): 
     return self.name 
+3

http://www.diveintopython.net/object_oriented_framework/defining_classes.html#d0e11720 –

回答

8

该代码不是废话,因为它可以完成您想要完成的任务。尽管如此,它并不是很pythonic。没有理由你应该使用getter或setter。只需直接访问属性。像

class Friend: 

    def __init__(self,name): 
     self.name = name 

您可以通过

friend = Friend('jeremy')

instantiate类现在只需访问name直接

print friend.name # jeremy

有一个良好的金额,以了解Python类幸亏Python提供无论如何,优秀的documentation您正在使用的rsion。

在这个例子中,要创建一个新朋友,你需要用一个名字来实例化它。

+1

呃,是否缺少'= name'在代码中? – delnan

+0

刚才看到ty – dm03514

2

你指的是默认的关键字参数。您在示例中指定它的方式意味着name在构造函数中是必需的。使其默认(并且能够构造后,设置)的方式是这样的:

class Friend(object): 

    def __init__(self,name=''): 
     self.name = name 

    def set_name(self,name): 
     self.name=name 

    def get_name(self): 
     return self.name 

现在你的类可以没有名字被实例化:

aFriend = Friend() 

正如意见建议,它不是“被认为是pythonic”来让setter和getters获得一个基本属性。但是,如果该属性需要计算,那么你可以把它的属性:

class Friend(object): 

    def __init__(self, firstname='', lastname=''): 
     self.firstname = firstname 
     self.lastname = lastname 

    @property 
    def firstname(self): 
     return self._first 

    @firstname.setter 
    def firstname(self, n): 
     self._first = n.capitalize() 

    @property 
    def lastname(self): 
     return self._last 

    @lastname.setter 
    def lastname(self, n): 
     self._last = n.capitalize()   

    @property 
    def fullname(self): 
     return "{0} {1}".format(self.firstname, self.lastname) 

f = Friend('frank') 
f.lastname = 'smith' 

f.firstname 
# 'Frank' 

f.lastname 
#'Smith' 

f.fullname 
#'Frank Smith' 
+1

使用setters和getter并不认为Pythonic。 – GreenMatt

+0

@GreenMatt:这不是问题。 OP正在询问如何创建类,以便在构造函数中不需要'name'。 – jdi

+1

的确,这不是问题,但这不是鼓励恶习的借口。 – GreenMatt