传递变量,创建实例,自我,类的机制和用法:需要解释 [关闭]
Posted
技术标签:
【中文标题】传递变量,创建实例,自我,类的机制和用法:需要解释 [关闭]【英文标题】:Passing variables, creating instances, self, The mechanics and usage of classes: need explanation [closed] 【发布时间】:2012-07-10 10:07:49 【问题描述】:我只是将一个工作程序重写为一个类中的函数,一切都搞砸了。
首先,在类的__init__
部分,我用self.variable=something
声明了一堆变量。
我应该能够通过在该函数中使用self.variable
来访问/修改类的每个函数中的这些变量吗?也就是说,通过声明self.variable
我已经把这些变量,类的范围内的全局变量都做了吧?
如果没有,我该如何处理自己?
其次,如何正确地向类传递参数?
第三,如何在类作用域之外调用类的函数?
第四,如何在另一个class OTHERCLASS
中创建class INITIALCLASS
的Instance,将变量从OTHERCLASS
传递到INITIALCLASS
?
我想使用来自INITIALCLASS
的参数从OTHERCLASS
调用一个函数。到目前为止我所做的是。
class OTHERCLASS():
def __init__(self,variable1,variable2,variable3):
self.variable1=variable1
self.variable2=variable2
self.variable3=variable3
def someotherfunction(self):
something=somecode(using self.variable3)
self.variable2.append(something)
print self.variable2
def somemorefunctions(self):
self.variable2.append(variable1)
class INITIALCLASS():
def __init__(self):
self.variable1=value1
self.variable2=[]
self.variable3=''
self.DoIt=OTHERCLASS(variable1,variable2,variable3)
def somefunction(self):
variable3=Somecode
#tried this
self.DoIt.someotherfunctions()
#and this
DoIt.someotherfunctions()
我显然不明白如何将变量传递给类或如何处理self
,什么时候使用它,什么时候不使用它。我可能也不明白如何正确创建一个类的实例。一般来说,我不了解课程的机制,所以请帮助我并向我解释,就像我不知道一样(我似乎不知道)。或者指点我看一个完整的视频,或可读的教程。
我在网上找到的都是超级简单的例子,对我没有多大帮助。或者只是类和类方法实例等的非常简短的定义。
如果你们愿意,我可以把我的原始代码发给你,但它很长。
【问题讨论】:
阅读 Python 教程section on classes。 请在此处了解格式化选项,尤其是代码。 我并不是要居高临下,但这里的元答案是您需要放慢速度,并准确找出代码偏离预期的地方。尝试从您的工作代码中进行一些小的更改并测试每个更改,直到出现问题。重构,他们称之为。另外,不要自责,这只是代码——在它出现之前它永远没有意义。 TO ->BrenBarn 我已经读过它,我的意思是它提供了非常基础的内容,但我不明白如何在更复杂的环境中使用它,因为我可能不明白其中的解释深度。本教程并没有真正帮助我。 mgilson 发布的内容更接近于让我理解,但 igeuss 写起来也更乏味。不过谢谢! @Marcin 我在我的旧帖子中问过几次,如何做有关格式化的事情,但没有得到答案。我到底做错了什么? @Marcin 谢谢!现在看起来好多了!我会记住这一点的。 【参考方案1】:下面是一个如何使用类的简单示例: 假设你是一家金融机构。您希望客户的帐户由计算机管理。因此,您需要对这些帐户进行建模。这就是类的用武之地。使用类称为面向对象编程。使用类,您可以在计算机中对真实世界的对象进行建模。那么,我们需要对一个简单的银行账户进行建模吗?我们需要一个保存余额的变量和一个保存客户姓名的变量。此外,还有一些方法可以增加和减少平衡。这可能看起来像:
class bankaccount():
def __init__(self, name, money):
self.name = name
self.money = money
def earn_money(self, amount):
self.money += amount
def withdraw_money(self, amount):
self.money -= amount
def show_balance(self):
print self.money
现在您有了一个简单帐户及其机制的抽象模型。
def __init__(self, name, money)
是类的构造函数。它在内存中建立对象。如果您现在想开设一个新帐户,您必须创建一个类的实例。为此,您必须调用构造函数并传递所需的参数。在 Python 中,构造函数由类名调用:
spidermans_account = bankaccount("SpiderMan", 1000)
如果蜘蛛侠想给 M.J. 买一枚新戒指,他必须取出一些钱。他会在他的帐户上调用withdraw
方法:
spidermans_account.withdraw_money(100)
如果他想查看他调用的余额:
spidermans_account.show_balance()
关于类的全部内容是对对象、它们的属性和机制进行建模。要创建一个对象,请像示例中一样实例化它。值通过 getter 和 setter 方法(如“earn_money()”)传递给类。这些方法访问您的对象变量。如果您希望您的类存储另一个对象,则必须在构造函数中为该对象定义一个变量。
【讨论】:
谢谢人非常有说明性!再次,我希望我也可以接受这个作为答案,因为它给了我一些很好的见解,但是 mgilson 的答案更容易传输到我的实际代码中。我希望所有的 python 文档都像你们在这里写的一样,我在 *** 上花费的时间更少:P!请不要现在私刑我,但我真的认为 python 文档在可理解性方面很差!再次感谢 MAxPowers,这帮了大忙! @Baf -- 就像其他任何事情一样,给它一些时间。一旦你开始学习事物的术语,python 文档真的非常好。换句话说,只要给自己一点时间来克服学习曲线,你就会像我们其他人一样爱上文档。 还有一个有趣的例子 +1。 很好的例子,但仍然很难想象你将如何在现实生活中实现它。您使用余额实例化该对象,但如果您关闭 Python,该帐户对象的余额将被遗忘。添加一些功能将余额存储在文本文件中,然后在每次创建帐户对象时从该文本文件中获取余额会很棒。【参考方案2】:class Foo (object):
# ^class name #^ inherits from object
bar = "Bar" #Class attribute.
def __init__(self):
# #^ The first variable is the class instance in methods.
# # This is called "self" by convention, but could be any name you want.
#^ double underscore (dunder) methods are usually special. This one
# gets called immediately after a new instance is created.
self.variable = "Foo" #instance attribute.
print self.variable, self.bar #<---self.bar references class attribute
self.bar = " Bar is now Baz" #<---self.bar is now an instance attribute
print self.variable, self.bar
def method(self, arg1, arg2):
#This method has arguments. You would call it like this: instance.method(1, 2)
print "in method (args):", arg1, arg2
print "in method (attributes):", self.variable, self.bar
a = Foo() # this calls __init__ (indirectly), output:
# Foo bar
# Foo Bar is now Baz
print a.variable # Foo
a.variable = "bar"
a.method(1, 2) # output:
# in method (args): 1 2
# in method (attributes): bar Bar is now Baz
Foo.method(a, 1, 2) #<--- Same as a.method(1, 2). This makes it a little more explicit what the argument "self" actually is.
class Bar(object):
def __init__(self, arg):
self.arg = arg
self.Foo = Foo()
b = Bar(a)
b.arg.variable = "something"
print a.variable # something
print b.Foo.variable # Foo
【讨论】:
嘿 mgilson,谢谢您的回复和您在帖子中付出的努力。类属性 bar 和实例属性 self.bar 到底有什么区别?除了 self.bar 因为它在 init 方法中而被立即调用?我的意思是我可以用 self.bar 做什么而我不能用 bar 做什么?另外,您为什么直接将这些参数传递给 a.method ?你不能在创建实例时将它们传递给 Foo() 并通过 Foo() 使用它们吗?如果是的话如何?如果实例是在另一个类中创建的,如果 Foo() 没有定义,你会怎么做?还是它总是被定义。 如果一个实例没有特定的实例属性,那么它会退回到类属性并使用它。因此,这是类的每个实例共享一条数据的一种方式。那有意义吗? (我在__init__
中添加了一些 cmets)。这有帮助吗?至于您的其他问题,传递给Foo()
的参数将转发给__init__
。如果有帮助,实例方法就像函数一样,只是它们的第一个参数是用于调用该方法的实例。
当我试图在 otherclass 中创建 myclass 的一个实例时,名称没有改变颜色,每个类名不应该被着色吗?假设我有一个通过 init 中的 self.variable 在 myclass 中定义的变量,我该如何在整个类方法中使用它?我可以在 myclass 中创建 otherclass 的实例,将变量传递给 otherclass 并将它们归因于 self.othervariable 并且可以在 otherclass 中使用,并且它的方法不必将它们传递给我的类中的实例方法?
它没有变色?那是什么意思?你的意思是语法高亮?这完全取决于您的编辑器...
@mgilson:注释令人印象深刻。【参考方案3】:
类的全部意义在于您创建了一个实例,并且该实例封装了一组数据。所以说你的变量在类的范围内是全局的是错误的:不如说一个实例拥有属性,并且该实例可以在其任何代码中引用它自己的属性(通过self.whatever
)。同样,给定实例的任何其他代码都可以使用该实例来访问该实例的属性 - 即instance.whatever
。
【讨论】:
以上是关于传递变量,创建实例,自我,类的机制和用法:需要解释 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章