質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2747閲覧

Pythonでオブジェクトのプロパティに変数でアクセス

snowfaller

総合スコア125

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2016/08/24 16:16

phpでは、以下の様に変数にプロパティ名を代入して、オブジェクトのプロパティの値を取得することができます。

php

1<?php 2class Test { 3 public $textProperty; 4 function Test($textValue) { 5 $this->textProperty = $textValue; 6 } 7} 8$inst = new Test('テキスト'); 9$propertyName = 'textProperty'; 10printf('%s'."\n", $inst->$propertyName); 11?>

このような記述をPythonで実施することはできますでしょうか?
私の浅いPythonの経験と知識では、以下の様なリフレクション的な記述で値を取得することぐらいしか思いつきません。

#!/usr/bin/env python3 # -*- coding: utf-8 -*- from sys import stdout class Test: textProperty = None def __init__(self, textValue): self.textProperty = textValue def main(): inst = Test('テキスト') propertyName = 'textProperty' stdout.write('%s\n' % getattr(inst, propertyName)) if(__name__ == '__main__'):main()

このPythonのコードをphpに直すと以下のようになると思います。

php

1<?php 2class Test { 3 public $textProperty; 4 function Test($textValue) { 5 $this->textProperty = $textValue; 6 } 7} 8$inst = new Test('テキスト'); 9$propertyName = 'textProperty'; 10printf('%s'."\n", $inst->__get($propertyName)); 11?>

このようなリフレクション的な記述ではなく、最初のphpの記述のように、コードベース(=関数等を使わない)で値を取得するようなコードの記述は、Pythonで可能でしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

これは可変変数という機能なのですが、大変珍しい機能でして、私の知る限り、この機能を実装しているメジャーなプログラミング言語はPHP以外にありません※。Pythonにももちろんありませんので、__get()getattr()__dict__等でリフレクションを使うか、eval()で無理矢理するかしかありません。

※ JavaScriptはinst[propertyName]のように書けないことがないですが、a.ba["b"]が同じであるという解釈ですので可変変数とは少し異なりますし、PHPのように$$aみたいなローカル変数に可変変数を使うことはできません。
※ 一部のBashで${!a}みたいにできるらしいのですが、未確認です。

投稿2016/08/24 22:22

編集2016/08/24 22:27
raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

snowfaller

2016/08/25 00:12

「可変変数」ですか! 独学でトライアンドエラーで学習する癖があり、正式な名称を知る機会がありません。ありがとうございます。 Pythonでは「可変変数」がないこと、了解いたしました。リフレクション的な処理で実装することに致します。 P.S. > メジャーなプログラミング言語はPHP以外にありません Cなどのレガシーな言語ですとポインタやポインタのポインタなどが近いですね。
guest

0

"textProperty"という文字列でもって、同名のメンバにアクセスしたいということですよね。
私が思いつく範囲で一番近いのは __dict__ ですかね。
メソッドの方は getattrしか思いつきません。

python

1class Test: 2 textProperty = None # ちなみにこれはclass変数になるので不要です。 3 def __init__(self, textValue): 4 self.textProperty = textValue 5 6 def add(self,x,y): 7 return x + y 8 9if __name__ == '__main__': 10 t = Test("abc") 11 prop_name = "textProperty" 12 method_name = "add" 13 14 print(t.__dict__[prop_name]) 15 # print(Test.textProperty) # None 16 print(getattr(t, method_name)(2,3))
> python sample.py abc 5

投稿2016/08/24 17:21

flied_onion

総合スコア2604

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

snowfaller

2016/08/25 00:10

ご回答ありがとうございます。 Pythonでは、ご提示いただいた__dirct__()や__getattr__()を使用して実装するしかなさそうですね。 頂いたご回答から、「class変数」「__dict__()」を知ることができました。ありがとうございます。
guest

0

ええっと、こういうことではなくてですか?

python

1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3from sys import stdout 4class Test: 5 textProperty = None 6 def __init__(self, textValue): 7 self.textProperty = textValue 8def main(): 9 inst = Test('テキスト') 10 stdout.write('%s\n' % inst.textProperty) # <-- 11if(__name__ == '__main__'):main()

9.3.5. Class and Instance Variables from python tutorial

投稿2016/08/24 16:54

attakei

総合スコア2738

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

snowfaller

2016/08/24 22:39

ご回答ありがとうございます。 ご提示いただいたコードがもっともシンプル(かつ美しい)コードです。 しかしながらそのコードはプロパティ名称が予め分かっていて、かつ不変である必要があります。 とある処理の汎用部品を作成しており、プロパティ名称は、コマンド引数やXML等のパラメータファイルから取得する予定です。 前提をお伝えしていなくて申し訳ありませんでした。
attakei

2016/08/25 02:01

あー、完全に題意を読み違えていました。申し訳ないです。 それ以外だと他の方の回答の通り、__dict__でアクセスするか、__getattr__あたりを使うぐらいしか思いつきませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問