在python中在类之间传递属性

2024-03-29 09:07:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我仍然不知道self和init是怎么做的,尽管读了一个又一个小时,已经筋疲力尽了。我最终放弃了理解它的功能,而是知道我需要在代码中包含它(实际上,我甚至不确定是否需要它)。在

无论如何,为了学习这些东西,我在一些教程中找到了一个示例程序,并决定尝试在不引用任何示例的情况下自行复制它。在

我这样做可能是完全错误的,但我想做的是有一个功能,当按下一个按钮来创建一个新的病历时,这个函数就会被调用。我所关注的是如何传递这些变量(它们被称为属性还是变量?)从按键功能到病人分类?我只是把那个函数作为一个方法放在那个类里面吗?还有,每次按下按钮我都可以创建一个新的病人吗?在

  def buttonpress():
      name = input("what's your name")
      age = input("what's your age")
      totalpatients +=1


  class patients:
      def __init__(self, name, age):
      self.name = name
      self.age = age

def displaypatient(self):
      print self.age, self.name

firstpatient=patients(name, 16)
firstpatient.displaypatient()

Tags: 函数nameself功能示例inputageyour
3条回答

类基本上由数据(属性)和对数据进行操作的函数(方法)集合组成。每个类的都有自己的方法副本。在

因此,类的每个*方法都在类的某个实例上运行,因此该方法需要知道它在哪个实例上操作。这就是selfself的意义,它只表示方法正在处理的实例。在

例如:

class House:
    def renovate(self):
        ''' Renovate a house, increasing its value. '''
        self.value += 10000

oldhouse = House() # make a House instance that has no attributes
oldhouse.value = 100000 # set an attribute of the House
mansion = House()
mansion.value = 10000000
oldhouse.renovate() # self will be set to oldhouse, so that oldhouse's value goes up
print oldhouse.value # prints 110000
print mansion.value # prints 10000000: it hasn't changed because renovate knew what it was operating on

现在,在这个例子中,注意我在类之外设置了.value。您可以这样做(Python允许您在几乎任何实例上设置任何属性),但对每个类都这样做有点麻烦。在

这就是__init__的作用。这是一个有特殊意义的方法(因此有双下划线)。在本例中,它是在创建类时调用的方法(当您使用parens调用类以生成新实例时)。init这里代表initialization:它是初始化类属性的函数。在创建类时,它接受的任何参数(超过self)都是预期的。在

因此,我们可以将示例改为:

^{pr2}$

它的工作原理是一样的,但要稍微好一些(因为我们不必在新的House上继续设置.value)。在


*除了staticmethods和classmethods,以及__new__

我觉得几周前我和你在同一条船上,虽然他们仍然很动摇,但我会尽力向你解释自我和自我。请温柔点,其他评论者!;)

我要先解释一下“自我”,因为它可能会使init更清楚。当我想上课时,我可以:

class Car:
    # I can set attributes here ( maybe I want all my cars to have a:
    size = 0
    # well eventually my car object is going to need to do stuff, so I need methods - 
    # methods are like functions but they are only usable by the class that encompasses them!
    # I create them the same way, just inside the indentation of the class, using def func():
    def drive(self):
        print "vroom"
    # pretend this is the function that I would call to make the car drive.

好吧。我们有一些事情要谈的只是这个布局。我们已经确定了汽车应该做什么,但我们还没有做任何事情。(我保证这一切都是相关的!) 为了创建car的实例(一次出现),我们可以将car对象赋给一个新变量:

^{pr2}$

现在我可以使用我们在car类中定义的所有方法,比如drive! 我们可以通过键入以下内容来调用该函数:

myCar.drive()

这会打印“vroom” 我可以在同一个程序中创建car()类的第二个实例(尽管它是一个完全不同的对象),方法是:

newCar = car()

现在,《盗梦空间》开始了。。。我做了一个非常简单的课程,课程变得非常庞大和可怕,几乎不可能在一个晚上就全部理解,但我现在要向你解释一下自我。在

“myCar”是我用来保存我创建的car对象的变量,如果我有其他方法需要引用该对象,它就变成了“self”参数。 本质上,我的车.vroom()就是说自我.vroom(),如果我需要在类的另一个方法中引用.vroom()。在

总而言之,我们有这样的东西:

class Car:
    size = 0 # a global attribute for all car objects
    def drive(self): #self is the argument!
        print "vroom!"
myCar = car() # we've initialized the class but havent used it here yet!
myCar.drive() # this prints "vroom"

另一种解释方法是,就像在普通函数中一样,self只是调用函数的对象的占位符。在

现在,如果有意义的话太棒了,否则我会再编辑一次。 definit(self):使用相同的理论,从类中获取一个对象,并在类每次创建对象时向它提供指令。在

class car:
    def __init__(self): # needs self, to refer to itself, right?
        self.name = name # now we can assign unique variables to each INSTANCE of the car class.

你可以使用definit并用它做一些疯狂的事情,比如在里面你可以立即调用其他方法和东西。基本上,就像说“嘿,物体!你还活着,去检查一下init函数里面有什么,你需要所有这些东西!快走!在

告诉我这是否有帮助,或者我能说得更清楚些。就像我说的,我只是把我的头都裹在这上面,所以也许我的解释需要一些工作。干杯:)

您尝试使用基本的面向对象编程,但需要了解类定义对象和属性。在

在下面的代码中,我们定义了一个Patient类:

class Patient:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def display(self):
        return "%s - %s"%(self.age, self.name)

它有一个名为__init__的方法,Python将其定义为初始化类中新对象时调用的方法,它有几个参数:

  • self-是对我们正在创建的对象的引用,我们不在这里讨论。但现在要明白传递给对象方法的第一个参数是对自身的引用。在
  • 姓名-患者的姓名,由我们定义
  • 年龄-我们也定义的年龄

第二个方法是一个我们可以调用对象的方法,让它返回一个我们可能希望打印出来的方法。在

下面的代码创建了一个病人,并从display方法打印了它的表示。在

^{pr2}$

下面是一段代码,可以用来构建一个病人数组,以便我们在以后的工作中使用。在

patients = [] # make an array with nopatients.
def getAnotherPatient():
    name = input("what's your name")
    age = input("what's your age")
    patients.append(Patient(name,age)) # Add a new patient
while somecondition:
    getAnotherPatient()

一旦我们在patients数组中建立了一个患者列表,我们就可以循环访问其中的对象,然后按正常方式操作或显示它们。在

相关问题 更多 >