我有这个代码,它将变量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的新手,我真的对此感到困惑。
答案 0 :(得分:1)
在类定义中声明属性时,例如
class X_increment(object):
x = 0
y = 0
x
和y
是类对象X_increment
的属性。当您在x1 = X_increment()
,x1.x
等实例上访问它们时,属性查找在实例x1
上失败,然后转到类对象,在它找到它。顺便提一下,由于x
和y
是类属性,x1
和x2
共享x
和y
(即x1.x
和x2.x
指的是相同的值。)
当您在__init__
中声明属性时,您需要在您正在创建的实例上明确设置它们:
class X_increment(object):
def __init__(self):
self.x = 0
self.y = 0
你不能再做x = 0
的原因是__init__
函数不在类体中执行,所以一旦函数完成局部变量x
和y
会消失。一旦您以这种方式定义__init__
,事情应该按预期工作:每个实例(x1
和x2
)都有自己的值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