[解決済み] Python ベクトルクラス
2022-02-08 03:05:48
質問
私はC#のバックグラウンドを持ち、このようなことはとても簡単なのですが、MayaのためにPythonに翻訳しようと思っています。
もっといい方法があるはずだ。基本的に、私は単純にx、y、z座標を持つVectorクラスを作りたいと思っていますが、このクラスが3つの座標すべてを持つタプルを返し、x、y、zプロパティを通してこのタプルの値を編集できれば、何らかの形で理想的です。
これは今のところ私が持っているものですが、そこには は は、exec文を使うよりも良い方法ですよね?私はexec文を使うのが嫌いです。
class Vector(object):
'''Creates a Maya vector/triple, having x, y and z coordinates as float values'''
def __init__(self, x=0, y=0, z=0):
self.x, self.y, self.z = x, y, z
def attrsetter(attr):
def set_float(self, value):
setattr(self, attr, float(value))
return set_float
for xyz in 'xyz':
exec("%s = property(fget=attrgetter('_%s'), fset=attrsetter('_%s'))" % (xyz, xyz, xyz))
解決方法は?
編集する。
私の回答のあるコードを@unutbuさんのオリジナルからもう少し修正し、簡略化して何が行われているのかを明確にしました。最新版では
@staticmethod
は完全に削除され、ネストされたワンライナーに置き換えられています。外側の関数とネストしたクラスは、名前を変更しました。
AutoFloatProperties
と
_AutoFloatProperties
のように、割り当てられた値を浮動小数点に変換して保存するという特殊な挙動を反映させることができます。それでも、メタクラスの代わりにクラス・デコレータを使った @unutbu さん自身の修正回答は、内部と使い方が非常に似ているものの、若干シンプルな解決策です。
def AutoFloatProperties(*props):
'''metaclass'''
class _AutoFloatProperties(type):
# Inspired by autoprop (http://www.python.org/download/releases/2.2.3/descrintro/#metaclass_examples)
def __init__(cls, name, bases, cdict):
super(_AutoFloatProperties, cls).__init__(name, bases, cdict)
for attr in props:
def fget(self, _attr='_'+attr): return getattr(self, _attr)
def fset(self, value, _attr='_'+attr): setattr(self, _attr, float(value))
setattr(cls, attr, property(fget, fset))
return _AutoFloatProperties
class Vector(object):
'''Creates a Maya vector/triple, having x, y and z coordinates as float values'''
__metaclass__ = AutoFloatProperties('x','y','z')
def __init__(self, x=0, y=0, z=0):
self.x, self.y, self.z = x, y, z # values converted to float via properties
if __name__=='__main__':
v=Vector(1,2,3)
print(v.x)
# 1.0
v.x=4
print(v.x)
# 4.0
関連
-
[解決済み】ilocが「IndexError: single positional indexer is out-of-bounds」を出す。
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] Pythonのクラスはなぜオブジェクトを継承するのですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonの非常に便利な2つのデコレーターを解説
-
pythonを使ったオフィス自動化コード例
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
Pythonの@decoratorsについてまとめてみました。
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】なぜ「LinAlgError: Grangercausalitytestsから「Singular matrix」と表示されるのはなぜですか?
-
[解決済み】"No JSON object could be decoded "よりも良いエラーメッセージを表示する。