#方法,属性,私有化加双下划线
'''
__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__')