0

尽管阅读了数小时后,我仍然不知道 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()
4

3 回答 3

2

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

我将尝试首先解释“自我”,因为它可能会使 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.

好的。在这里,我们有一些东西要讨论这个布局。我们已经定义了汽车应该做什么,但我们还没有做出任何东西。(我保证这是所有相关的!)为了使汽车的实例(单次出现),我们可以将汽车对象分配给一个新变量:

myCar = car()

现在我可以使用我们在汽车类中定义的所有方法——比如驾驶!我们将通过键入以下内容来调用该函数:

myCar.drive()

这将打印“vroom”我可以通过执行以下操作在同一程序中创建 car() 类的第二个实例(尽管这将是一个完全不同的对象):

newCar = car()

现在,开始部分来了……我做了一个非常简单的课程,课程变得非常庞大和可怕,实际上不可能在一个晚上全部理解它们,但我现在要向你解释自己。

如果我有其他需要引用该对象的方法,我用来保存我创建的汽车对象的变量“myCar”将成为“self”参数。本质上,myCar.vroom() 与 self.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 只是调用该函数的任何对象的占位符。

现在,如果这有道理真棒,如果没有,我会再次编辑它。def init (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.

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

让我知道这是否有帮助,或者我是否可以更清楚地说明。就像我说的,我几乎没有完全理解这一切,所以也许我的解释需要一些工作。干杯:)

于 2013-09-10T06:02:58.993 回答
1

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

在下面的代码中,我们定义了一个 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 - 是对我们正在创建的对象的引用,我们不会在这里讨论。但是现在了解传递给对象方法的第一个参数是对自身的引用。
  • name - 我们定义的患者姓名
  • 年龄 - 我们也定义的年龄

第二种方法是我们可以在对象上调用的方法,让它返回我们可能想要打印出来的方式。

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

firstpatient=patients(name, 16)
print firstpatient.display()

下面是一段代码,可用于构建一组患者,供我们稍后使用。

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数组中建立了一个患者列表,我们就可以遍历其中的对象,然后按照正常方式操作或显示它们。

于 2013-09-10T05:48:17.980 回答
0

一个基本上由数据(属性)和操作该数据的函数(方法)的集合组成。类的每个实例都有自己的数据副本,但共享方法。

因此,类的每个*方法都在该类的某个实例上进行操作,因此该方法需要知道它正在操作的实例是什么。这就是self目的 -self仅表示方法正在使用的实例。

因此,例如:

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__进来的地方。这是一种具有特殊含义的方法(因此是双下划线)。在这种情况下,它是在创建类时调用的方法(当您使用括号调用类以创建新实例时)。init这里代表initialization:它是一个初始化类属性的函数。创建类时,它需要(超出self)的任何参数都是预期的。

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

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

oldhouse = House(100000) # make a House instance with the value set
mansion = House(10000000) # make another House instance with the value set
oldhouse.renovate()
print oldhouse.value # prints 110000
print mansion.value # prints 10000000

并且它的工作方式相同,但会更好一些(因为我们不必继续设置.valuenew Houses)。


*除了静态方法和类方法,以及特殊情况,如__new__

于 2013-09-10T06:19:02.537 回答