2012-11-07 217 views
1

我是python的新手。我熟悉C++。我會將流動的C++代碼轉換爲python。將指針數組傳遞給python類

class School{ 
    School(char *name, int id, Student* pointers){ 
    { 
     this.name=name; 
     this.weapon=weapon; 
     this.students=pointers; 
    } 
    print(){ 
     for(int i=0;i<10;i++){ 
      this.students.print(); 
     } 
    } 
}; 

正如你看到的,我想一個指針傳遞給Student類型 的對象的數組,我不知道,如果蟒蛇讓我傳遞指針。這是我在python中做的

class School(): 
    def __init__(self, name, *students): 
     self.name=name 
     self.students=students 

    def display(self): 
     for student in self.students 
      student.display() 
+0

爲什麼不只是在一個更高的範圍和訪問的數組? – Serdalis

+0

該數組是私有類變量 – user1061392

+0

在python中沒有這樣的東西作爲私有變量。 – Serdalis

回答

0

在python中,它完美地發現將整個列表傳遞給構造函數。
Python無論如何都會通過列表作爲參考。

class School(): 
    def __init__(self, name, students): 
     self.name=name 
     self.students=students 

    def display(self): 
     for student in self.students 
      student.display() 
在這種情況下 self.students

是原來的students列表


測試,這是下面的代碼的好方法的引用:

original = ['a','b'] 

class my_awesome_class: 
    def __init__(self, a): 
     self.my_list = a 

    def print_list(self): 
     self.my_list.append("my_awesome_class") 
     print(self.my_list) 

my_class = my_awesome_class(original) 

print (original) 
my_class.print_list() 
print (original) 

對於您可能需要額外的閱讀看看python variable names from a c perspective

+0

我發現你沒有for循環。你有一個對象b。您正在打印對象。你的對象b有樹元素'a','b'和'lol'。我想打印三個或更多的對象。每個對象都有不同的名稱。 – user1061392

+0

@ user1061392我一次打印整個列表以方便閱讀,這是一個概念證明,而不是您正在做什麼的示例。如果您願意,您可以使用for循環打印列表的元素。 – Serdalis

+0

我的問題是我在「學生在self.students」中有「SyntaxError:invalid syntax」 – user1061392

0

Python doesn'沒有指針。或者,更確切地說,Python中的所有是一個指針,包括名稱,列表中的條目,屬性...... Python是一種「傳遞引用」語言。

這裏有幾個簡單的例子:

In [1]: a = ['hello', tuple()] # create a new list, containing references to 
           # a new string and a new tuple. The name a is 
           # now a reference to that list. 

In [2]: x = a # the name x is a reference to the same list as a. 
       # Not a copy, as it would be in a pass-by-value language 

In [3]: a.append(4) # append the int 4 to the list referenced by a 

In [4]: print x 
['hello',(), 4] # x references the same object 

In [5]: def f1(seq): # accept a reference to a sequence 
    ...:  return seq.pop() # this has a side effect: 
           # an element of the argument is removed. 

In [6]: print f1(a) # this removes and returns the last element of 
4     # the list that a references 

In [7]: print x # x has changed, because it is a reference to the same object 
['hello',()] 

In [8]: print id(a), id(x) 
4433798856 4433798856 # the same 

In [9]: x is a # are x and a references to the same object? 
Out[9]: True 

Python提供高層次的結構做的事情,你需要指針運算爲C.所以你永遠不必擔心給定的變量是否是指針與否,就像你從不需要擔心內存管理一樣。

+0

如何傳遞對象數組並使用for循環打印每個對象 – user1061392

+0

我知道Python中的所有內容都是指針,但它不允許我執行for循環 – user1061392

+0

' for obj in lst:print obj'。爲此,您需要確保列表中的對象具有'__repr__'或'__str__'方法。內置類型已經擁有它們,但是您需要爲自定義對象定義自己的類型。 –

0

您鍵入的內容基本上就是您想要的內容,但有一個關鍵區別。注意學生之前沒有明星:

class School(): 
    def __init__(self, name, students): 
     self.name=name 

     self.students=students 

    def display(self): 
     for student in self.students: 
      student.display() 

這意味着你將實例化一個像這樣的學校(佔學生一個構造函數):

s1 = Student('Bob') 
s2 = Student('Fill') 

school = School("Generic School",[s1,s2]) 

如果你__init__方法看起來像def __init__(self, name, *students):,然後你會實例化完全相同的學校有:

s1 = Student('Bob') 
s2 = Student('Fill') 

school = School("Generic School",s1,s2) 

的原因是*students__init__(對任何方法都適用)意思是「取其餘的傳遞的非關鍵字參數並將它們粘在student列表中。