0

我对 Oops 有点陌生,我对 Python 类感到困惑。虽然我在高中学习 C++,但我知道我当时学的根本不是 C++(它是一种带类的 C,没有模板, STL,或命名空间)

如果我错了,请纠正我,但对我来说,类只是对象的蓝图,对吧?

现在,如果我想在 C++ 中创建一个类的实例(例如,我的类名是“动物”)

我会这样做: 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,当我想创建一个实例时,我必须使用括号,即使我没有指定任何构造函数(这在 C++ 中不是必需的),任何特殊原因或只是语言语法问题?

4

3 回答 3

8

Python 中的一切都是对象。类是创建其他对象的对象。

因此,当您引用 时animal.val,您是在引用class上的class属性。val animal

如果你想实际创建一个类型的对象animal,你会调用类并返回一个实例:

your_animal = animal()

然后,您在该实例上设置的任何内容都只为该实例设置(而对类的更改在通过该类创建的所有对象之间共享)。

有关 Python 中的类的更多详细信息,请参见此处

于 2012-05-21T17:35:38.130 回答
2

现在使用 python,我可以在不创建任何实例的情况下引用动物(我不能在 C++ 中这样做,对吧?)

您已经声明了一个静态变量。如您所见,如果没有关键字,它可能会有些混乱。您所做的与staticc++ 类中的相同

要创建实例变量,需要将其显式分配给实例。

class animal:     
  def __init__(self):
     self.val = 0


your_animal = animal()
your_animal.val = 3

animal.val不再全球可用。

于 2012-05-21T17:36:22.623 回答
2

为了类比 C++(顺便说一句,用大写名称声明类是一种很好的做法,以区分类和成员,这是通过小写的约定):

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.valanimal.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
于 2012-05-21T17:48:42.930 回答