Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 班级如何运作_Python_Class - Fatal编程技术网

Python 班级如何运作

Python 班级如何运作,python,class,Python,Class,我试图找出一个非常简单的问题,但我仍然不太明白一个类是如何工作的。例如,如果我想创建一个名为“Friend”的类,其属性为“name”,这是否意味着我必须先给出一个名为“name”的变量?那么我如何定义构造函数来允许“name”的规范呢?这代码是胡说八道吗?提前感谢您的回复 class Friend: def __init__(self,name): self.set_name(name) def set_name(self,name): s

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

这段代码不是胡说八道,因为它完成了您想要完成的任务。不过,它不是很像蟒蛇。没有理由使用getter或setter。直接访问属性即可。像

class Friend:

    def __init__(self,name):
        self.name = name
你可以坐火车来上课

friend=friend('jeremy')

现在只需直接访问
name

print friend.name#jeremy

有很多关于python类的知识需要学习,幸运的是,python为您所使用的任何版本都提供了极好的支持


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

您所指的是默认关键字参数。您在示例中指定它的方式意味着构造函数中需要
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'

使用setter和getter并不被认为是python式的。@GreenMatt:这不是问题所在。OP询问如何创建类,以便构造函数中不需要
name
。没错,这不是问题所在,但这不是鼓励不良做法的借口。@Hedde-总括语句“属性是非音速的”?当然,我认为仅仅使用它们来返回隐藏属性是不好的。但是为了实际转换值,进行大量检查,更新其他成员?一个名为
fullname
的只读属性如何,它只返回
第一个
最后一个
属性集的串联?@Hedde:将属性放在任何地方都是因为它肯定是非音速的。但是属性的全部意义在于,您可以避免编写getter和setter,如果以后改变主意,可以将属性转换为属性,而不是重写所有客户机代码。那很像蟒蛇。