object_test.py

#方法,属性,私有化加双下划线
'''
__a 从外部无法访问,但是类的内部可以访问。实际上还是能在类外访问这些私有方法,尽管不应该这么做:s._A__a
如果不需要使用这种方法但是又不行让其他对象不要访问内部数据,可以使用单下划线
前面有下划线的名字都不会被带星号的imports语句导入
'''
class Person:
    def setname(self,name):
        self.name=name
    def getname(self):
        return self.name
    def greeting(self):
        print("Hello world! I'm %s" % self.name)
name1=Person()
name2=Person()
name1.setname('aa')
name2.setname('bb')
name1.greeting()
name2.greeting()

print(name1.name)   #从外部直接访问属性
name2.name='cc'
name2.greeting()



class Test:
    name='aa'
    def method(self):
        print('self.%s'% self.name)
def function():
    print('no self')
a=Test()
b=a.method  #绑定方法到变量上
b()

a.method=function   #绑定方法到普通函数上
a.method()



#注意区别
#当没有self.num++时,C.num++会影响类,实例的num
#当调用过1次self.num++或self.num='sth'后,C.num++不会影响实例的num,只有self.num++会影响
#使用C.num必须显示声明num。只使用self.num,不用声明num(但是++前要先赋值)
class B:
    num=0
    def initB(self):
        B.num+=1
    def initb(self):
        self.num+=1
class B:
    num=0
    def initB(self):
        B.num+=1
        self.num+=1
class B:
    num=0
    def initB(self):
        self.num+=1
        B.num+=1



#超类的继承顺序,先继承的类中的方法会重写后继承的类中的方法,包括构造方法
class Cal:
    def cal(self, express):
        self.value=eval(express)
    def talk(self):
        print('cal\'talk ', self.value)
class Talk:
    def talk(self):
        print('value: ', self.value)
class TalkCal(Cal, Talk):
    pass
tc=TalkCal()
tc.cal('1+2')
tc.talk()
class TalkCal(Talk, Cal):
    pass
tc=TalkCal()
tc.cal('1+2')
tc.talk()

#接口检查
hasattr(tc, 'talk')
hasattr(tc, 'pink')

callable(getattr(tc, 'talk', None))
callable(getattr(tc, 'pink', None))
#
hasattr(getattr(a,'fun3'), '__call__')

 

posted @ 2016-06-26 14:51  *飞飞*  阅读(143)  评论(0)    收藏  举报