我对Oops有点新意,我对Python课程感到困惑。虽然我在高中学习过C ++,但我知道我当时学的是C ++本来就没有C ++(有点C类,没有模板,STL或命名空间)
如果我错了,请纠正我,但对我而言,课程只是对象的蓝图,对吗?
现在,如果我想在C ++中创建一个类的实例(例如,我的类名是“animal”)
我会这样做:
animal lion;
或者如果我有一个构造函数(带参数),那么我只会这样做animal tiger(4,5);
我面临的问题是:
class animal:
val = 5
它只是一个基本类,没有任何构造函数或方法:
现在使用python,我可以在不创建任何实例的情况下引用动物(我不能在C ++中这样做,对吧?)
animal.val = 7
我面临的另一个问题是,我需要在创建实例时始终使用括号,否则它将引用类本身。
例如;
lion = animal
lion.val = 6
tiger = animal
print tiger.val
并打印6,当我想创建一个实例时我要使用paranthesis,即使我没有指定任何构造函数(在C ++中不是必需的),任何特殊原因或只是语言问题语法?
答案 0 :(得分:8)
Python中的所有内容都是一个对象。 类是创建其他对象的对象。
因此,当您引用animal.val
时,您会在类 val
上引用类属性animal
。< / p>
如果你想真正创建一个animal
类型的对象,你可以调用该类并获取一个实例:
your_animal = animal()
然后,您在该实例上设置的任何内容仅针对该实例设置(而对类的更改将在通过该类创建的所有对象之间共享)。
有关Python中类的更多详细信息,请参阅here。
答案 1 :(得分:2)
现在使用python我能够引用动物,因为它没有 创建它的任何实例(我不能在C ++中这样做,对吧?)
您已声明了一个静态变量。正如您所看到的,没有关键字可能会让人感到困惑。你所做的与c ++类中的static
相同
要创建实例变量,需要将其显式分配给实例。
class animal:
def __init__(self):
self.val = 0
your_animal = animal()
your_animal.val = 3
animal.val
已不再全球可用。
答案 2 :(得分:2)
显示类比C ++(顺便说一下,使用大写名称声明clases是一种好的做法,区分类和小写的对象成员):
class Animal:
val = 4 # class variable
def __init__ (self, val = 0): # constructor (takes 0 or 1 argument)
self.member_val = val # instance variable
您致电animal = Animal(5)
以创建新实例。观看Animal.val
和animal.val
的不同之处:
animal = Animal(5)
print Animal.val, animal.member_val
>>> 4 5
C ++中的等效代码是:
class Animal {
public:
Animal() { // constructor with no arguments
this.member_val = 0;
}
Animal(int val) { // constructor with argument
this.member_val = val;
}
public:
int member_val; // member (instance) variable allocated for each instance
static int val = 4; // class level static variable
}
课程用法:
Animal animal = new Animal(5);
cout << Animal.val << " " << animal.member_val
>>> 5 4