2

我试图找出一个非常简单的问题,但我仍然不能完全理解一个类是如何工作的。例如,如果我想创建一个名为“Friend”的类,并带有一个名为“name”的属性,这是否意味着我必须先给出一个名为“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
4

2 回答 2

8

该代码并非胡说八道,因为它完成了您想要完成的工作。不过,它不是很pythonic。没有理由你应该使用 getter 或 setter。直接访问属性即可。喜欢

class Friend:

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

你可以通过实例化你的类

friend = Friend('jeremy')

现在直接name访问

print friend.name # jeremy

有很多关于 python 类的知识,幸运的是 python 为你使用的任何版本提供了优秀的文档

在此示例中,要创建一个新朋友,您需要使用名称对其进行实例化。

于 2012-12-06T21:30:14.610 回答
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()

正如评论中所建议的那样,为基本属性设置 setter 和 getter 并不是“被认为是 pythonic”。但是,如果该属性需要计算,那么您可以将其设为属性:

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'
于 2012-12-06T21:31:06.117 回答