# -*- coding: cp936 -*-
class Person:
def setName(self,name):
self.name=name
def getName(self):
return self.name
def greet(self):
print("Hello,world! I'm %s" % self.name)
self.__hello()
def __hello(self):
print("hello")
foo = Person()
bar = Person()
foo.setName("zhangsan")
bar.setName("lisi")
foo.greet()
bar.greet()
print(foo.name)
bar.name = "wangwu"
bar.greet()
#print(bar.__hello())#__方法只有内部可以访问
#内部方法setattr和getattr
setattr(bar,"name","setName")
print("set and get",getattr(bar,"name"))
#继承,Python支持多继承
class Student(Person):
def study(self):
print("%s study..." % self.name)
st1 = Student()
st1.setName("xiaoming")
st1.greet()
st1.study()
#查看是否继承,是返回True,不是返回False
if issubclass(Student,Person):
print("True")
#查看继承关系
#>>> Person.__bases__
#()
#>>> Student.__bases__
#(<class __main__.Person at 0x012281B8>,)
#isinstance(x,y)可以检查x是否属于y的实例
#抛出异常
b,a=2,1#将a改成0测试
if a==0:
raise Exception("除数为0")
else:
print(b/a)
#捕获异常
b,a=2,1#将a改成0测试
try:
c=b/a
except ZeroDivisionError:
print("除数为0")
finally:
print("除法执行完毕")
#类似java的构造方法
class Test1:
def __init__(self):#相当于构造方法
self.iii =42
Init = Test1()#__init__方法已经执行
print(Init.iii)
class Test2:
def __init__(self,value=42):#相当于构造方法
self.iii =value
Init = Test2("change !!!")#__init__方法已经执行,并执行赋值
print(Init.iii)
#Python也可以覆盖方法
#类名__init__(self)可以调用父类的构造函数
#super调用父类方法
#__len__返回各种类型的数量,如:序列长度,Map键值数
str = [1,2,3,4]
print(str.__len__())
#property绑定变量
class Rectangle:
def __init__(self):
self.width=0
self.height=0
def setSize(self,size):
self.width,self.height=size
def getSize(self):
return self.width,self.height
size = property(getSize,setSize)
#很明显这里size代替了get和set方法
r = Rectangle()
r.width=10
r.height=5
print(r.size)
r.size=25,30
print(r.size)
#迭代器,还有__iter__
it =iter([1,2,3])
for i in range(len([1,2,3])):
print(it.next())
运行结果:
Hello,world! I'm zhangsan
hello
Hello,world! I'm lisi
hello
zhangsan
Hello,world! I'm wangwu
hello
('set and get', 'setName')
Hello,world! I'm xiaoming
hello
xiaoming study...
True
2
除法执行完毕
42
change !!!
4
(10, 5)
(25, 30)
1
2
3