0

それぞれが本とそのプロパティの一部を表す文字列のリストがあります。

# each book followed by the price and the name of the genre
book_names = ['love 3 romance',
              'rose 6 drama',
              'flower 7 nice_story']

これらの本ごとに新しいオブジェクトを何らかの方法で作成し、文字列の他の部分をその属性の説明にしたいと考えています。

これは私が試したものです(明らかに、うまくいきません):

class Book_Class():
  price=0
  genre=''
  book_content=[]

for i in book_names:
  name=i.split()[0]
  name=Book_Class()
  name.price=i.split()[1]
  name.genre=i.split()[2]

たぶん、私が求めているものを達成する簡単な方法があるかもしれません(私はプログラミングにかなり慣れていないので教えてください...)。

4

3 に答える 3

7

いくつかの方法があります:

  1. 代わりに辞書を使用してください。多くの場合、それで十分です。

    keys = ['name', 'price', 'gender']
    book = { k: v for k, v in zip(keys, i.split()) }
    
  2. Bookクラスに意味のある__init__初期化子を与えます。

    class Book(object):
        name = ''
        price = 0
        gender = None
    
        def __init__(self, name, price, gender):
            self.name = name
            self.price = price
            self.gender = gender
    

    解析された値をそれに渡します:

    Book(*i.split())
    
  3. 最後の手段としてsetattr、既存のオブジェクトに任意の属性を設定するために使用できます。

    book = Book()
    for attr, value in zip(keys, i.split()):
        setattr(book, attr, value)
    
于 2012-10-10T11:41:23.270 に答える
1

同じタスクを実行する別の方法は、名前付きタプルを使用することです。

book_names = ['love 3 romance',
              'rose 6 drama',
              'flower 7 nice_story']

from collections import namedtuple
book = namedtuple("Book", "name price genre")

# convert book_names to books
[book(*b.split()) for b in book_names]

Output: [Book(name='love', price='3', genre='romance'),
         Book(name='rose', price='6', genre='drama'),
         Book(name='flower', price='7', genre='nice_story')]

その後、期待どおりにプロパティにアクセスできます

book1 = [book(*b.split()) for b in book_names][0]
print book1.name, book1.price, book1.genre
Output: ('love', '3', 'romance')

最初のパラメーターを変数名として使用する場合は、次のようにします。

book = namedtuple("Book", "price genre")
for b in book_names:
    globals()[b.split()[0]] = book(*b.split()[-2:])

# now you can access your books:
love.price 
于 2012-10-10T12:26:20.933 に答える
0

Ashwini Chaudharyによって与えられた答えは、globals()を使用しています。

# each book followed by the price and the name of the genre
book_names = ['love 3 romance',
              'rose 6 drama',
              'flower 7 nice_story']
class Book_Class():
  price=0
  genre=''
  book_content=[]
for i in book_names:
  nnn='name'
  globals()[nnn]=i.split()[0]
  name=Book_Class()
  name.price=i.split()[1]
  name.gender=i.split()[2]
于 2012-10-10T12:06:20.317 に答える