传递变量、创建实例、self、类的机制和用法:需要解释

2024-10-03 19:20:32 发布

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

我已经坐了一整天了,我已经有点累了,所以请原谅我的简短。

我是python新手。

我只是重写了一个工作程序,变成了一个类中的一堆函数,一切都搞砸了。我不知道是不是我,但我很惊讶我找不到一个关于如何在网上处理课程的初学者教程,所以我有几个问题。

首先,在类的__init__部分,我用self.variable=something声明了一堆变量。

我应该能够通过在类的每个函数中使用self.variable来访问/修改这些变量,这是正确的吗?换句话说,通过声明self.variable,我已经使这些变量成为类范围内的全局变量,对吗?

如果没有,我该如何处理自己?

其次,如何正确地向类传递参数?一些示例代码会很酷。

第三,如何调用类作用域之外的类的函数?一些示例代码会很酷。

如何在另一个class OTHERCLASS中创建class INITIALCLASS的实例,将变量从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,何时使用,何时不使用。我可能也不知道如何正确地创建类的实例。总的来说,我不懂课程的结构,所以请帮助我,像我不知道一样向我解释。或者给我一个完整的视频,或者可读的教程。

我在网上找到的都是超级简单的例子,对我没什么帮助。或者只是类和类方法实例等的非常简短的定义

如果你们愿意的话,我可以把我的原始代码发给你们,但它很长。


Tags: 实例函数代码self示例initdefvariable
3条回答

类的全部要点是创建一个实例,该实例封装一组数据。所以说你的变量是类范围内的全局变量是错误的:比如说一个实例拥有属性,而这个实例可以在它的任何代码中引用它自己的属性(通过self.whatever)。类似地,给定实例的任何其他代码都可以使用该实例访问实例的属性-即instance.whatever

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

下面是一个如何使用类的简单示例: 假设你是一家金融机构。您希望客户的帐户由计算机管理。所以你需要对这些账户进行建模。这就是上课的地方。使用类称为面向对象编程。使用类可以在计算机中模拟真实世界的对象。那么,我们需要什么来建立一个简单的银行账户模型呢?我们需要一个保存余额的变量和一个保存客户名称的变量。此外,还有一些方法来平衡和减少平衡。看起来像是:

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()”。这些方法访问对象变量。如果希望类存储另一个对象,则必须在构造函数中为该对象定义一个变量。

相关问题 更多 >