2017-06-19 9 views
-1

クラスの新しいオブジェクトを(Pythonで)作成することは可能ですか?同じクラスの新しいオブジェクトをPythonで作成していますか?

私はそれが動作するとは思わないこのコードを書いたアイデアを説明するために。

新しいオブジェクトが現在のオブジェクト(新しい属性等。)

デック(両端キュー)のように見えます
class LinkedList: 

    def __init__(self): 
     """ Construct an empty linked list. """ 
     self.first = None 
     self.last = None 

    def insert_before(self, new_item, next_item): 
     """ Insert new_item before next_item. If next_item is None, insert 
     new_item at the end of the list. """ 

     # First set the (two) new prev pointers (including possibly last). 
     if next_item is not None: 
      new_item.prev = next_item.prev 
      next_item.prev = new_item 
     else: 
      new_item.prev = self.last 
      self.last = new_item 
     # Then set the (two) new next pointers (including possibly first). 
     if new_item.prev is not None: 
      new_item.next = next_item 
      new_item.prev.next = new_item 
     else: 
      new_item.next = self.first 
      self.first = new_item 

    # assuming l1, l2 obj of class node with prev and next (attributes) 
    def slice(self, l1, l2): 
     curr = l1 

     new = LinkedList() 
     new.first = l1 
     new.last = l2 
     if l1.prev is not None: 
      l2.prev = l1.prev 
     else: 
      self.first = l2.next 
      self.first.prev = None 

     if l2.next is not None: 
      l1.next = l2.next 
     else: 
      self.last = l2.next 
     Return new 

class Node: 

    def __init__(self, value): 
    """ Construct an item with given value. Also have an id for each item, 
    so that we can simply show pointers as ids. """ 

     Node.num_items += 1 
     self.id = Node.num_items 
     self.prev = None 
     self.next = None 
     self.value = value 

    def __repr__(self): 
    """ Item as human-readable string. In Java or C++, use a function like 
    toString(). """ 

     return "[id = #" + str(self.id) \ 
      + ", prev = #" + str(0 if self.prev is None else self.prev.id) \ 
      + ", next = #" + str(0 if self.next is None else self.next.id) \ 
      + ", val = " + str(self.value) + "]" 
+1

を。とにかく 'test'には何も属性がないので、この例は少し無意味です。なぜそれは動作しないと思いますか?そして、あなたは「新」と何をしたいのですか? (Btw、あなたの '__init__'に構文エラーがあります) – 5gon12eder

+0

あなたのコードは正常に動作します。それを試しましたか? –

+0

@ 5gon12eder私は実際のコードで試して、属性の値を変更しようとしたために動作しませんでした – james

答えて

4

それは(Pythonで)それ自体がクラスの新しいオブジェクトを作成することは可能ですか?

はい。それは完全に可能です。ここで

は一例です:

>>> class A: 
    def __init__(self, value): 
     self.value = value 

    def make_a(self, value): 
     return A(value) 

    def __repr__(self): 
     return 'A({})'.format(self.value) 


>>> a = A(10) 
>>> a.make_a(15) 
A(15) 
>>> 

「なぜPythonがNameErrorを上げていない。しかしAクラスがまだ定義されていない?」今、あなたはおそらく、考えています Pythonがあなたのコードを実行する方法のためにこれが動作する理由。

Aクラス、具体的にはmake_aメソッドをPythonが作成しているときに、識別子Aが呼び出されていることがわかります。 Aが関数であるかクラスであるか、またはAであるかどうかはわかりません。と定義されています。しかし、それは知る必要はありません。

Aは実行時に正確に決定されます。これは、AであるかどうかをPythonが確認する唯一の時間です。実際にはが定義されています。

これはまた、あなたが未定義の変数を参照する機能コンパイルすることができた理由です:あなたが表示されているコードはtest` `の完全に独立したインスタンスを作成し

>>> def foo(): 
    a + b 


>>> foo # Python compiled foo... 
<function foo at 0x7fb5d0500f28> 
>>> foo() # but we can't call it. 
Traceback (most recent call last): 
    File "<pyshell#9>", line 1, in <module> 
    foo() # but we can't call it. 
    File "<pyshell#7>", line 2, in foo 
    a + b 
NameError: name 'a' is not defined 
>>> 
+0

これは一般的な答えです。ありがとう! – james

+0

@Jamesを手伝ってくれてうれしい。 –

1

とスライス操作は右終了されていないから明確に独立していなければなりません。アイテムの前/次のリンクをl1の前にフィックスアップし、l2の後のフィックスをフィックスアップする必要があります。

def slice(self, l1, l2): 
    new = LinkedList() 
    new.first = l1 
    new.last = l2 
    if l1.prev: 
     l1.prev.next = l2.next 
    if l2.next: 
     l2.next.prev = l1.prev 
    l1.prev = l2.next = None 
    return new 
+0

これはコードをクリーンアップします。それへの誇り。しかし、これは本当に彼の_main_質問に答えているようではありません。_ "クラスの新しいオブジェクトを(Pythonで)作成することは可能ですか?" –

+0

しかし、これはリスト自体を変更すると思います。スライス機能が必要な部分を戻し、実際のリストが更新されます。 list = [1、2、3、4] list.slice(2,3)は戻って[2,3]を返し、リストは[1,4] – james

+0

というコードのアイデアである。スライス(リスト全体)や最初の要素リスト(a、a)など、いくつかの問題が見つかりました。私はいくつかのより多くの場合、仕事をするだろうと思う – james

関連する問題