我仍然不知道自己和初学者做了什么,尽管已经用尽了几个小时的阅读。我终于放弃了试图理解它的作用,而只是知道我需要将它包含在我的代码中(实际上我甚至不确定是否需要它)。
无论如何,为了学习这些东西,我已经在一些教程中找到了一个示例程序,并决定尝试自己复制它而不引用任何示例。
我可能这样做完全错了,但我要做的是有一个按下按钮创建新患者记录时调用的功能。我坚持的部分是如何将这些变量(它们被称为属性或变量?)从按钮按下功能传递给患者类?我是否只将该函数作为该类中的方法?另外,无论如何我每次按下按钮都可以创建新患者吗?
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()
答案 0 :(得分: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.
好。我们在这里只讨论这个布局。我们已经确定了汽车应该做什么,但我们还没有做任何事情。 (我保证这一切都是相关的!) 为了进行汽车的INSTANCE(单次出现),我们可以将汽车对象分配给一个新的变量:
myCar = car()
现在我可以使用我们在汽车类中定义的所有方法 - 就像驱动器一样! 我们可以通过键入:
来调用该函数myCar.drive()
这将打印“vroom” 我可以通过以下方式在同一个程序中创建第二个car()类的实例(尽管这将是一个完全不同的对象):
newCar = car()
现在,这里有一个初始部分...我已经完成了一个非常简单的课程,课程变得非常庞大和可怕,并且在一夜之间完全无法理解它们,但我要解释自己你现在。
“myCar”,我用来保存我所制造的汽车对象的变量,如果我有其他方法需要引用回那个对象,它就变成了“自我”参数。 本质上,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 功能里面的内容,你需要拥有所有这些东西! GO!
让我知道这是否有帮助,或者我是否可以做得更清楚。就像我说的那样,我几乎只是围绕着这一切,所以也许我的解释需要一些工作。干杯:)
答案 1 :(得分: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定义为从类初始化新对象时调用的方法,并且有几个参数:
第二种方法是我们可以调用对象的方法,让它返回一种我们可能想要打印出来的方法。
下面我们有创建患者的代码,并从显示方法中打印出它的表示。
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
数组中构建患者列表,我们就可以遍历其中的对象,然后按照正常情况操纵或显示它们。
答案 2 :(得分: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__
的用武之地。这是一种具有特殊含义的方法(因此是双重下划线)。在这种情况下,它是一个在创建类时调用的方法(当您使用parens调用类来创建新实例时)。 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
它会有相同的效果,但更好一些(因为我们不必继续在新的.value
上设置House
)。
* 除了staticmethods和classmethods,以及__new__
等特殊情况