0.类的私有性
Python中对象的属性是可以从外部访问的,本身不直接支持私有性,对此的解释是
Isn’t it enough that each object manages its own attributes?
在Python中如果要使方法或属性从外部不可访问,则必须在名字前加上两个下划线
方法__inaccessible则外部不可见,但实际在类的定义时,双下划线开始的方法会被自动“转换”为名字前加上单下划线再加上类名
Secretive._Secretive__inaccessible
---> <unbound method Secretive.__inaccessible>
s._Secretive__inaccessible()
---> Bet you can't see me...
1.创建类
习惯上第一个参数都是self,传递参数时不用写出。self是用来甄别不同的实例对象的
注意此时name属性对外是可见的。
此外实例中的函数可动态更改(注意不是类的函数)
def fun():
print "haha, You'll be terminated!"
foo.greet = fun
foo.greet() ---> haha, You'll be terminated!
以上的方法均为bound method,是与某个实例绑定的。
下面是个综合例子,结合函数一章中的几个技巧
Python中对象的属性是可以从外部访问的,本身不直接支持私有性,对此的解释是
Isn’t it enough that each object manages its own attributes?
在Python中如果要使方法或属性从外部不可访问,则必须在名字前加上两个下划线
方法__inaccessible则外部不可见,但实际在类的定义时,双下划线开始的方法会被自动“转换”为名字前加上单下划线再加上类名
Secretive._Secretive__inaccessible
---> <unbound method Secretive.__inaccessible>
s._Secretive__inaccessible()
---> Bet you can't see me...
1.创建类
习惯上第一个参数都是self,传递参数时不用写出。self是用来甄别不同的实例对象的
注意此时name属性对外是可见的。
此外实例中的函数可动态更改(注意不是类的函数)
def fun():
print "haha, You'll be terminated!"
foo.greet = fun
foo.greet() ---> haha, You'll be terminated!
以上的方法均为bound method,是与某个实例绑定的。
下面是个综合例子,结合函数一章中的几个技巧
函数没有返回值
f.goodFood
---> ['SPAM', 'Eggs', 'Bacon', 'Rat', 'Spring Surprise']
menu = ['Filet Mignon', 'Pasta', 'Pizza', 'Eggs', 'Bacon', 'Tomato', 'SPAM']
rec = filter(f.likes, menu)
rec ---> ['Eggs', 'Bacon', 'SPAM']
reduce(f.prefers, rec) ---> 'SPAM'
2.类的名字空间
m1 = MemberCounter()
m1.init()
m1.add()
m2 = MemberCounter()
m2.init()
m2.add()
MemberCounter.members ---> 2
m2.members ---> 2
m2.mymember ---> 1
但是一旦有实例对class中的变量赋值,该变量即被Rebind到该实例
m1.members = "hello"
m1.members ---> "hello"
m2.members ---> 2
3.指定SuperClassic(继承)
4.判断父子关系
issubclass(SPAMFilter, Filter) ---> True
issubclass(Filter, SPAMFilter) ---> False
也可以直接得到父类
SPAMFilter.__bases__
---> (<class __main__.Filter at 0x171e40>,)
Filter.__bases__ ---> ()
5.判断是否为其实例
s = SPAMFilter()
isinstance(s, SPAMFilter) ---> True
isinstance(s, Filter) ---> True #注意这里也是True
isinstance(s, str) ---> False
也可以直接得到类信息
s.__class__ --->
<class __main__.SPAMFilter at 0x1707c0>
6.多重SuperClass(多重继承)
7.对接口的检测
Python中不需要显式地写出接口,你可检测它
tc = TalkingCalculator()
hasattr(tc, 'talk') ---> True
hasattr(tc, 'fnord') ---> False
还可以检测是否可调用
callable(getattr(tc, 'talk', None)) ---> True
callable(getattr(tc, 'fnord', None)) ---> False
#其中getattr返回函数对象,且可以提供默认值,此处为None
#getattr的逆函数为setattr,它可以为对象增加一个属性
setattr(tc, 'name', 'Mr. Gumby')
tc.name ---> 'Mr. Gumby'
#obj.__dict__可返回obj对象的所有属性。
f.goodFood
---> ['SPAM', 'Eggs', 'Bacon', 'Rat', 'Spring Surprise']
menu = ['Filet Mignon', 'Pasta', 'Pizza', 'Eggs', 'Bacon', 'Tomato', 'SPAM']
rec = filter(f.likes, menu)
rec ---> ['Eggs', 'Bacon', 'SPAM']
reduce(f.prefers, rec) ---> 'SPAM'
2.类的名字空间
m1 = MemberCounter()
m1.init()
m1.add()
m2 = MemberCounter()
m2.init()
m2.add()
MemberCounter.members ---> 2
m2.members ---> 2
m2.mymember ---> 1
但是一旦有实例对class中的变量赋值,该变量即被Rebind到该实例
m1.members = "hello"
m1.members ---> "hello"
m2.members ---> 2
3.指定SuperClassic(继承)
4.判断父子关系
issubclass(SPAMFilter, Filter) ---> True
issubclass(Filter, SPAMFilter) ---> False
也可以直接得到父类
SPAMFilter.__bases__
---> (<class __main__.Filter at 0x171e40>,)
Filter.__bases__ ---> ()
5.判断是否为其实例
s = SPAMFilter()
isinstance(s, SPAMFilter) ---> True
isinstance(s, Filter) ---> True #注意这里也是True
isinstance(s, str) ---> False
也可以直接得到类信息
s.__class__ --->
<class __main__.SPAMFilter at 0x1707c0>
6.多重SuperClass(多重继承)
7.对接口的检测
Python中不需要显式地写出接口,你可检测它
tc = TalkingCalculator()
hasattr(tc, 'talk') ---> True
hasattr(tc, 'fnord') ---> False
还可以检测是否可调用
callable(getattr(tc, 'talk', None)) ---> True
callable(getattr(tc, 'fnord', None)) ---> False
#其中getattr返回函数对象,且可以提供默认值,此处为None
#getattr的逆函数为setattr,它可以为对象增加一个属性
setattr(tc, 'name', 'Mr. Gumby')
tc.name ---> 'Mr. Gumby'
#obj.__dict__可返回obj对象的所有属性。