关于类变量和实例变量? (蟒蛇)

时间:2017-08-31 22:37:25

标签: python

我有这个代码,它将变量x或y加10,但它也有一个方法可以防止这些值超过100或低于0.该程序要求用户输入哪个值增加x或y值:

class X_increment(object):

     x=0
     y=0

     def x_y(self,min=0,max=100):

        if self.x<=min:
            self.x=0
        elif self.x>=max:
            self.x=100

        if self.y<=min:
            self.y=0
        elif self.y>=max:
            self.y=100



x1=X_increment()
x2=X_increment()

while (True):

  z=input("Press x to increase x")

  if z=='x':
    x1.x+=10
    x1.y-=5
    x1.x_y()
    print(x1.x,x1.y)

  elif z=='y':
    x1.y+=10
    x1.x-=5
    x1.x_y()
    print(x1.x,x1.y)

  elif z=='e':
    break

  else:
    print("not valid")

print("the value of x and y is:",x1.x,x1.y)
print("the value of x and y of the x2 instance is",x2.x,x2.y)

我正在使用它来测试如何修改实例的值并且它有效,但我尝试了相同的代码但是初始化这样的变量:

def __init__(self):

    x=0
    y=0

它没有用,我试着以多种方式调用变量,但它只是没有用,所以我想有一些我做错了或者你不能在“构造函数”中改变变量我正在尝试做什么?,我不知道,我是编程和python的新手,我真的对此感到困惑。

2 个答案:

答案 0 :(得分:1)

在类定义中声明属性时,例如

class X_increment(object):
    x = 0
    y = 0

xy是类对象X_increment的属性。当您在x1 = X_increment()x1.x等实例上访问它们时,属性查找在实例x1上失败,然后转到类对象,在它找到它。顺便提一下,由于xy是类属性,x1x2共享xy(即x1.xx2.x指的是相同的值。)

当您在__init__中声明属性时,您需要在您正在创建的实例上明确设置它们:

class X_increment(object):
    def __init__(self):
        self.x = 0
        self.y = 0

你不能再做x = 0的原因是__init__函数不在类体中执行,所以一旦函数完成局部变量xy会消失。一旦您以这种方式定义__init__,事情应该按预期工作:每个实例(x1x2)都有自己的值x和{{1 }}。 y是对您调用该方法的单个实例的引用。

您可能也对[{3}}感兴趣,这是一种更通用,更强大的self方法编写方法。

答案 1 :(得分:0)

类变量和实例变量之间的区别在于类变量不需要访问实例。在以下示例中,我声明并使用类变量:

class Test:
    classVariable = 5

#no need to create an instance of the class
print(Test.classVariable) #prints 5
Test.classVariable = 10
print(Test.classVariable) #prints 10

实例变量可以在已创建的每个实例上具有不同的值:

class Test:
    def __init__(self):
        self.instanceVariable = 0;

#creating 2 instances of the same class
instance1 = Test()
instance2 = Test()

#they start with the same value
print("1=%s, 2=%s" % (instance1.instanceVariable, instance2.instanceVariable))
#prints "1=0, 2=0"

#but we can modify the value on each instance separatly
instance1.instanceVariable = 5;
print("1=%s, 2=%s" % (instance1.instanceVariable, instance2.instanceVariable))
#prints "1=5, 2=0"

print(Test.instanceVariable) #this won't work

在类中的函数外声明的变量是类变量。实例变量可以通过多种方式声明,其中一种在构造函数或其他函数中使用self.xxx