Python类和对象

时间:2012-05-21 17:30:02

标签: python

我对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 ++中不是必需的),任何特殊原因或只是语言问题语法?

3 个答案:

答案 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.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