クラスは代入も関数も引数も参照渡しをする
2 :
◆LKDzGov2.g :2008/09/05(金) 17:58:22
Python特有の癖 ・代入を行うと名前がいつも最も内側のスコープに入る。 ・代入はデータのコピーをしない。 ⇒単に名前をオブジェクトに結びつける(bind)だけ。
__ __ n _____ _____ ___ ___ ___ | | / / / / / | /__ __/ [][] _| |_| |__ _| |_ | |. / / /⌒ヽ/ / / ̄ ̄|. l / / | _ | |_ レ'~ ̄| | | / / ( ^ω^ ) / /. / / | |___  ̄| | / / / /| | | | / / ノ/ / ノ /  ̄ ̄ / \__| | |  ̄ /_ / | |_ | |. / / // / ノ / / ̄ ̄ ̄ |_| |__| \/ | |/ / ⊂( し'./ / / |. / | ノ' / / | /. し' ./ /  ̄ ̄ ̄  ̄ ̄
関数のローカルな名前空間は、関数が呼び出されたときに作成され、 関数から戻ったときや、関数内で例外が送出され、かつ関数内で処理され なかった場合に削除されます。
スコープはある名前空間が直接アクセスできる、Python プログラムのテキスト上の領域。 ⇒``直接アクセス可能'' とは、限定なしである名前を参照 した際に、その名前空間から名前を見つけようと試みること。 実行中はいつでも、直接名前空間にアクセス可能な、少なくとも三つの 入れ子になったスコープがある。 最初に検索される最も内側のスコープには、ローカルな名前が入っている。 あるいは、最も内側のスコープを囲んでいる関数群のスコープで、最も 近傍のスコープから検索を始める。 中間のスコープが次に検索され、 このスコープには現在のモジュールのグローバルな名前が入っている。 (最後に検索される) 最も外側のスコープは、組み込みの名前が入った 名前空間。
このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。
クラスの中で定義された変数が「クラス変数」 クラスの中の__init()__メソッドや他のメソッドの中で定義されたのが「インスタンス変数」 「クラス変数」も「インスタンス変数」も self.nameでアクセスすることができる 。 self.nameでアクセスする場合、「インスタンス変数」は同名の「クラス変数」を隠蔽する。 変更不能な値をもつクラス変数は、インスタンス変数のデフォルト値と して使える。
あ、Python なら合ってるかも…自信無いなった
>>> range(3, 6) # 個別の引数を使った通常の呼び出し [3, 4, 5] >>> args = [3, 6] >>> range(*args) # リストからアンパックされた引数での呼び出し [3, 4, 5] ちょっと便利だと思った
スクリプト言語なら当たり前
14 :
デフォルトの名無しさん :2008/09/06(土) 22:00:40
うるせえ俺の日記だだまれ屑
↑帰れ偽者
16 :
デフォルトの名無しさん :2008/09/06(土) 22:40:11
↑お前も偽物
17 :
デフォルトの名無しさん :2008/09/06(土) 22:48:21
↑お前も偽物
18 :
デフォルトの名無しさん :2008/09/06(土) 22:52:27
------[再会]------
------[第一部完]------
オレはようやく登りはじめたばかりだからな。 このはてしなく遠いPython坂をよ…
>self.nameでアクセスする場合、「インスタンス変数」は同名の「クラス変数」を隠蔽する。 この機能知らなかったけど、 こんな機能使ってるようなコードって読みづらくないか? インスタンス変数とクラス変数は全部違う名前にするべきでは?
文句があるなら出て行け
24 :
デフォルトの名無しさん :2008/09/07(日) 09:56:48
>>> float(7.3) 7.2999999999999998 気をつける
>>> 0.1 0.10000000000000001 >>> 0.1.__str__() '0.1' >>> import decimal >>> decimal.Decimal('0.1') Decimal("0.1")
decimal使う奴は童貞
decimal使わない奴はヤリチン
a
オブジェクトはアイデンティティ値 (identity) 、型 (type) 、そして値 (value) を持つ。 オブジェクトが一度生成されると、そのオブジェクトの アイデンティティ値 は決して変化することがない。 アイデンティ ティ値をオブジェクトのメモリ上のアドレスと考えてもかまわない。 演算子 `is' は、二つのオブジェクト間のアイデンティティ値を比 較する。 関数 id() は、オブジェクトのアイデ ンティティ値を表す整数 (現在の実装ではオブジェクトのメモリ上のアドレス) を返す。 外部リソースを明示的に解放する 方法は大抵 close() メソッドを使う。 この場合`try...finally' 文を使うと 便利。 他のオブジェクトに対する参照をもつオブジェクトもあり、コンテナと呼ぶ。 コンテナオブジェクトの例 として、タプル、リスト、および辞書がある。 "a = 1; b = 1" とすると、 a と b は値 1 を持つ 同じオブジェクトを参照するときもあるし、そうでないときもある。 "c = []; d = []" とすると、 c と d はそれぞれ 二つの異なった、互いに一意な、新たに作成された空のリストを参照する ことが保証されている。 "c = d = []" とすると、 c と d の両方に同じ オブジェクトを代入する。
class X: は旧式のクラスになり、 class X(object): は新しい形式のクラスになる。 クラス定義から普通に (定義の終端に到達して) 抜けると、 クラスオブジェクト (class object) が生成される。
ok
__dict__ オブジェクトの (書き込み可能な) 属性を保存するために使われる辞書または 他のマップ型オブジェクト。 module.__dict__ はモジュールのシンボルテーブルを含む辞書。 この辞書を修正すると、実際にはモジュールのシンボルテーブルを変更するが、 __dict__ 属性を直接代入することはできない。 m.__dict__['a'] = 1 と書いて m.a を 1 に定義することはでるが、m.__dict__ = {} と 書くことはできない。
#--mdl.py-- class X(object): pass import sys sys.modules[__name__] = X() のようにモジュールファイル「mdl.py」下部に下2行を追加すると、 import mdl したときに、クラスXのインスタンスがモジュールのようにロードされる。 インポート元で import sys sys.modules["mdl"] の値を比較するとわかる。
>>34 あんまそういうuglyなことすんな
それと削除依頼出してこい
>>35 仕様書どおりにしかプログラム書けない底辺野郎はROMってろ
仕様書通りに書けるなら立派な底辺じゃないか
------[第二部完]------
------[再会]------
------[第三部完]------
オブジェクトはクラスをテンプレートとして生成される。 クラスのテンプレートはメタクラス。 type(obj) はオブジェクトobj の型/クラスを返す。 新しいtype クラスは、関数new.classobj が提供してきたのと同様のクラス・ファクトリーの役割を果たす。 >>> X = type('X',(),{'foo':lambda self:'foo'}) >>> X, X().foo() (<class '__main__.X'>, 'foo') Xはクラスオブジェクト
43 :
デフォルトの名無しさん :2008/09/09(火) 20:14:44
------[第四章 モンバーバラの姉妹]------
ラムダについて 式 lambda arguments: expression は関数オブジェクトになる。 そして def name(arguments): return expression と同じ動作をする。
------[第四部 モルモンの侵攻とタプルたん]------
class文を実行するとメタクラスが必ず関わる。 メタクラスは 旧式クラスはtypes.ClassType 新式クラスはtype 自分でtypeをサブクラス化してカスタムメタクラスを作る事も可能。 クラス定義が読み込まれる際、__metaclass__ が定義されていれば、 type() の代わりに __metaclass__ が指している 呼び出し可能オブジェクトが呼び出される。 __metaclass__ この変数は name、bases、および dict を引数として 取るような任意の呼び出し可能オブジェクトにできる。 【メタクラスの決定順】 dict['__metaclass__'] があればそれを使います。 それ以外の場合で、最低でも一つ基底クラスを持っているなら、 基底クラスのメタクラス (__class__ 属性を探し、なければ 基底クラスの型) を使います。 それ以外の場合で、__metaclass__ という名前のグローバル変数 があれば、それをつかいます。 それ以外の場合には、旧形式のメタクラス (types.ClassType) を使います。
typeはクラス >>> import inspect >>> inspect.isclass(type) True
Python Code Readingで 今週金曜日のお題になってたところだな
ちょwwwwww主催者に要望メール送ろうと思ったらブログのコメント欄だったwwworz
まるちゃん乙!
#新らしい形式クラス
class X(object):
pass
class Y():
__metaclass__ = type
Z = type("Z",(),{})
#古い形式クラス
class H():
pass
print type(X) #<type 'type'>
print type(Y) #<type 'type'>
print type(Z) #<type 'type'>
print type(H) #<type 'classobj'>
>>46 のメタクラス決定順の通り、クラスオブジェクトHは旧式のメタクラスが使用されている。
#「ok]という属性にだけ代入ができるクラスA #ラッパー関数 def rap(func): def t(self, name, value): if name == "ok": func(self, name, value) else: raise AttributeError("代入できません") return t class A(): class __metaclass__(type): __setattr__ = rap(type.__setattr__)
>>54 こっちの方が解りやすかった
class A():
class __metaclass__(type):
def __setattr__(self, name, value):
if name == "ok":
type.__setattr__(self, name, value)
else:
raise AttributeError("代入できません")
>>> class A(object): ... __slots__ = ("ok",) ... >>> a = A() >>> a.ok = 0 >>> a.ng = 0 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'A' object has no attribute 'ng'
>class A(): > class __metaclass__(type): その書き方は、Guido が completely unreadable って言ってた
>>58 まじ?class定義の中でまたclass定義してるのがイヤなのかな?
となると
class B(type):
def __setattr__(self, name, value):
if name == "ok":
type.__setattr__(self, name, value)
else:
raise AttributeError("代入できません")
class A():
__metaclass__ = B
って感じなのかな〜?
あるクラスが __getitem__() という名前のメソッドを定義 しており、 x がこのクラスのインスタンスであるとすると、 x[i] は x.__getitem__(i) と等価になります。 特に注釈の ない限り、適切なメソッドが定義されていない場合にこのような演算を行おうと すると例外が送出されます。 #コンテナをエミュレートする class A(object): def __getitem__(self, key): pass x = A() の場合 x[i]とx.__getitem__(i)は等価
つかなんでPythonはじめたのさ 回りに使ってる奴皆無だろ。
ほう
>>61 特別な理由はないよ。Rubyでもよかった。Webアプリとか作れれば。
>回りに使ってる奴皆無だろ。
そもそも周りにプログラマーがいない
だってニートだし
>>61 Rubyよりライブラリがあるんじゃないの?
__contains__()メソッドはインスタンスオブジェクトoにKey kが存在するかのチェックを if k in o と簡単に書けるようにするためのメソッド
コンテナへ反復処理を実装する。 そのためには__iter__()メソッドを定義する。 このメソッドはイテレータオブジェクトを返すようにする。 イテレータオブジェクトはイテレータプロトコルをサポートする必要がある。 __iter__()とnext()の2つのメソッドがイテレータプロトコルを成す。 class A(object): data = "abc" def __iter__(self): return iter(self.data) >>> a = A() >>> for c in a: ... c ... 'a' 'b' 'c'
クラス自体で next() を定義している場合、__iter__() では 単に self を返すようにできる。 class B(object): data = "abc" index = 0 def __iter__(self): print type(self) return self def next(self): print type(self) if self.index == len(self.data): raise StopIteration self.index += 1 return self.data[self.index - 1] selfの中身はインスタンス。 selfという名前は慣習。
素の list が結構便利に出来てるから、 そこまで手の込んだクラスがどうしても必要になる場面は そんなに多くないよ。まあ、知ってて損はないけど
>>69 ありがと。自分も途中で「これ使う時あんのかな?」って思ってた。
string モジュールを使ったプレースホルダ import string s = string.Template("$who have $what") #キーワード引数を使用する print s.substitute(who='I', what='apple') #I have apple #テンプレートにないKeyはスルーされる print s.substitute(who='I', what='apple', a="abc") #I have apple #辞書オブジェクトが引数の場合 d = dict(who='I', what="apple") print s.substitute(d) #I have apple #locals()を引数にする。 #locals()は値のある変数をキーとした人工的な辞書 msg = string.Template("the square of $number is $square") for number in range(10): square = number * number print msg.substitute(locals())
これなんとかマーケティングとかいうやつだろ
73 :
デフォルトの名無しさん :2008/09/12(金) 23:38:57
1はどんな本、もしくはWEBで勉強してるの?
? 答える義務なんてないと思うが きもい奴がいますね
マップ型のfromkeysメソッド mapping.fromkeys(seq[, value]) seq からキーを作り、値が value であるような、新しい辞書を作成します >>> d = {"A":1,"B":2} >>> d {'A': 1, 'B': 2} >>> dict.fromkeys([k.lower() for k in d]) {'a': None, 'b': None}
78 :
デフォルトの名無しさん :2008/09/14(日) 22:51:40
>>75 サンクス。
本高いな、オライリーだからかな?
>>76 「間違えた」って言ってる割には、リンク先のタイトルと一致してないんだけど・・・
みんPyとJython本はネタとしてよくリンクが貼られる
本人じゃないとしたら、誰かが著者を陥れようとしてるのかなぁ・・・
ま、たいてい唐突にこういうの出る場合関係者の自演だと思うがな。 だってまったく話題にあがってこないものだったわけだからね
>>78 /\___/\
/ / ヽ ::: \
| (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ,,ノ(、_, )ヽ、,, | < まーたageた
| ,;‐=‐ヽ .:::::| \_______
\ `ニニ´ .:::/
/`ー‐--‐‐―´´\
83 :
デフォルトの名無しさん :2008/09/15(月) 21:33:29
ここってsage進行なの?
urllib2でプロキシ&UserAget
import urllib2
#ProxyHandlerインスタンスを生成
proxies = urllib2.ProxyHandler({"http" : "
http://host:port "})
#OpenerDirectorインスタンスを生成
opener = urllib2.build_opener(proxies)
#UserAgetを変更
opener.addheaders = [("User-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)")]
#インストール
urllib2.install_opener(opener)
#出力
print urllib2.urlopen(url).read() #print opener.open(url).read()でも一緒、その場合openerのインストールは不要
例外のelse文は例外が送出されなかった場合に実行される。 except 節は例外名の後に変数が指定可能。 try: print i except ZeroDivisionError, e: print "例外ZeroDivisionErrorです。:", e except NameError: print "例外NameErrorです。" else: print "else文です。"
ユーザ定義の例外はException クラスから導出して、新しい例外クラスを作成する class MyError(Exception): ・・・
tryって、例外を自分で処理するために使うんだよね? try文で囲ってない部分で例外が発生したら、そのプログラムが強制終了すると。
89 :
デフォルトの名無しさん :2008/10/13(月) 10:04:44
勉強してるうちに勉強そのものが目的になって もともと何が作りたかったのか忘れてることってない?
>>89 HaskellやらLispやらの勉強は特にそうだよなwww
奴らじゃなきゃ出来ない事なんてないわけだし、むしろ一般的なライブラリやドキュメントが少くて不便なことも多い。
例えばGUIとか。
91 :
sage :2008/10/13(月) 16:46:23
>>89 あるある。
もともと作りたいものが具体的にないんだけどね。
勉強している時は、これであんなことやこんな事が出来そうと思ってワクワクする。
でも気づいたら完成したソフトが出来てない。
そして、飽きて次の言語に・・・
92 :
デフォルトの名無しさん :2008/10/13(月) 16:59:34
perlで作ったものは完成したけど表面的なものはともかく中身はぐちゃぐちゃだった phpで作ったものは完成したけど楽しくなかった rubyで作ったときは楽しかったけど完成しなかった pythonは楽しく作れてしかも完成出来て中身もすっきり
93 :
デフォルトの名無しさん :2008/10/17(金) 08:24:52
Pythonはパッケージ管理がしっかりしているから良い バイナリ配布方法も含めて
94 :
デフォルトの名無しさん :2008/10/24(金) 18:39:41
setuptools で bdist_wininst は Windows でしか 使えないと思っていたが,Linux 上でもできた・・・ exe ファイルが出来やがった… Windows な友人に渡すためだけに Windows 上で setuptools 動かしてたおれって orz
>>94 distutils/command/ にWindows用のインストーラーのexeが入ってて
bdist_wininst すると必要なファイルを作って固めてインストーラーの後ろにくっつけてるから
96 :
デフォルトの名無しさん :2008/12/29(月) 21:03:17
age
sage
今日から始めた、おっぱいそん。 今チュートリアル4が終わりそう。 3日くらいでそこそこ使えるようになるかな? ゆっくりまったりこの正月で覚えるぜ。
99 :
デフォルトの名無しさん :2008/12/31(水) 00:20:21
うおおおおおおおおおおチュートリアル大体読み終わったぜ。 バストサイズはアップした。形だな、次は、うん。 次はどこに進めばいいんだろうか。 とりあえずもっかい読み直すか。
100 :
デフォルトの名無しさん :2008/12/31(水) 07:38:58
工学社のはじPyこうたのはいいんだが ネットワークプログラミングのほうだた 一冊目ほしいなー
フッフフウァッ!ユクゾッ ユクゾッ ユクゾッ フッフフウァッ!ユクゾッ ユクゾッ ユクゾッ ユクゾッ フッフフウァッ!ユクゾッ ユクゾッ ユクゾッ フッフフウァッ!ユクゾッ ユクゾッ ユクゾッ ユクゾッ
102 :
デフォルトの名無しさん :2009/01/04(日) 23:09:15
┏━━━━━━━━━━━━━━━━━━━━━┓ ┃ ━ ╋━╋ ╋┓┏┓ ┳┻┳┏━ ┣━┳━ ┃ ┃ ━ ┏┳┓ ┃┃┗┛ ┻━┻┃ ┃ ┃ ┃ ┃ ━ ┗╋┛ ┏━┓ ┃ ┣┳ ┏━╋━ ┃ ┃ ━ ━╋━ ┣━┫ ━╋━┃┃ ┃ ┃ ┃ ┃┏┓━╋━ ┣━┫ ┏╋┓┃┃ ━┻━╋━ ┃ ┃┃┃ ┃ ┗━┛ ┃┃┃┃┃ ┃ ┃ ┃┗┛━┻━ ━┛┗━ ┃┃┃┃┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━┛ ∩ 〈〈〈 ヽ 〈⊃ } (\___/) | | ( ̄l▼  ̄)! ! / ● ● | / / l ___\lミ/ /▲ ( 。--。 ) /■___ (( ̄)) 新年あけましておめでとうございますーーっ! (___)  ̄/ 2009年 元旦
テキストファイルの行を1行ずつ 配列に格納していきたいのですが下の書き方で エラーが出ます。 動的に格納していくやり方はないものでしょうか? お願いします。 oF = open("hogehoge.txt","r") i = 0 for line in oF: list[i] = line i+=1
104 :
103 :2009/02/23(月) 02:54:25
自己解決しました。 oF = open("hogehoge.txt","r") list = [] #空リスト作って i = 0 for line in oF: print(line) list =list + [line] #連結していく i+=1 これでOKでした。
L = [] f = open("hogehoge.txt") for line in f: L.append(line) f.close() とかは??
list(open("hogehoge.txt"))
open("hogehoge.txt").readlines()
ばかばかしいな
そうかなあ
111 :
デフォルトの名無しさん :2009/09/29(火) 08:31:08
.
快感が大事です。
てす
Pythonの勉強はやめちまったのかよ…
俺もパイソンやるぞ
117 :
デフォルトの名無しさん :2011/11/20(日) 11:20:04.45
やったの?
118 :
忍法帖【Lv=40,xxxPT】 :2011/11/24(木) 10:34:35.32
ほしゅ
勉強の途中成果、書きこめやー
かっこいいPython使いはデコレータをどう使うかで決まるらしい
俺もパイソンはじめたぞ
おれはフルモンティだが?
じゃあ、俺もパイソンをやるよ。コルトじゃないけどな。
124 :
デフォルトの名無しさん :2012/06/10(日) 23:02:57.01
俺も始めるぞ
125 :
デフォルトの名無しさん :2012/06/15(金) 08:17:19.13
┌─┐ │●│ └─┤ _ ∩ ( ゚∀゚)彡 ┌─┬⊂彡 │●│ おっぱい!おっぱい! └─┘
126 :
uy :2012/06/25(月) 16:31:45.66
なんか &nbsp; 覚えない奴ってほんとになんなんだ Pythonのソースコード貼り付けてインデントなしとか半角スペースとか そんな書き込みしか出来ないなら2chやるなよ
Le plus important est invisible 「大切なものは、目に見えない」
馬鹿には無理
130 :
デフォルトの名無しさん :2012/06/26(火) 11:23:25.40
みんなのぱいちんくん、みんなの、、、
131 :
デフォルトの名無しさん :
2012/06/26(火) 12:59:11.40 芸人山崎ほうせいがpythonは きれいな言語だって言ってたよ。