2009年9月10日木曜日

Super bound unboundについて

superという関数について調べる。


class super(object)
| super(type) -> unbound super object
| super(type, obj) -> bound super object; requires isinstance(obj, type)
| super(type, type2) -> bound super object; requires issubclass(type2, type)
| Typical use to call a cooperative superclass method:
| class C(B):
| def meth(self, arg):
| super(C, self).meth(arg)

super(type)っての要するにtypeの基底クラスを与えるのか?
では、
super(type,obj) ->bound super object.ってどういうこと?


しらべてみるとboundってのはメソッドがどっかのインスタンスに属している。unboundは属していないってことらしい。

boundメソッドは、そのまま関数として使える。unboundメソッドはそのまま関数として使おうとするとだめ。

次のコードを例にとって考えてみる。

class Bassclass:
def __init__(self,str1):
self.a = str1+"bass class"
def func1(self):
return self.a

print Bassclass().func1()

C++だと、コンストラクタにselfなんて渡さなかった(たぶん)けど、pythonだとselfを渡さないとだめ。また、何も引数がいらなさそうなfunc1()もselfを渡すような形で定義してやら無いとダメ。
上のコードだとBassclassっていうスコープの中だからいちいちself.aなんて書かなくてもいいのかと思ってたけどそうじゃないみたい。


疑問点が1つ。
class Bassclass(object)
という文があるが、これを
class Bassclass()
にするとなんか知らんけどだめ。

新スタイルクラスとクラシックスタイルクラスってのがあるらしい。
新スタイルクラスではobjectの派生クラスとして定義しないとダメらしい。
んで、新スタイルクラスではスタティックメソッドとクラスメソッドが使えるそうな。
スタティックメソッドは、インスタンスなしで使用できるメソッド。普通のクラスに属さないメソッドみたいなもんか。
クラスメソッドは、クラスを渡すメソッド。こっちは全く分からん。


class Bassclass(object):
def __init__(self,str1):
self.a = str1+"bass class"

def func1(self):
return self.a

class Derivedclass(Bassclass):
def __init__(self, str1, str2):
super(self.__class__, self).__init__(str1)
self.b = str2
def func1(self):
return self.a
def func2(self):
return self.b

d = Derivedclass("ouou",12)
print d.func1()
print d.func2()

0 件のコメント:

コメントを投稿