#类的基本知识
#类对象的优点:多态,封装,继承#多态
from random import choice
s=['A',"B","C","D"]
ch=choice(s)#从列表中随机选择元素,并返回
print(ch)#例:序列中的count函数为多态函数,不管时字符串类型还是列表类型,都可以使用该函数
#很多函数和运算符都是多态的,不需要确定对象的具体类型#封装:是指向程序中的其他部分隐藏对象的具体实现细节的原则#继承:子类,超类(基类)
#class语句会在函数定义的地方创建自己的命名空间
_metaclass_=type#确定使用新式类,可以通过type(对象)来查看实例对象所属的类class People:def getName(self):#self参数为对象自身的引用return self.namedef setName(self,name):self.name=namedef Print(self):print("Hello world! I'm %s."%self.name)
person=People()
person.setName("Li")
print(person.getName())
person.Print()person.name='Wang'
print(person.getName())
person.Print()#上述self参数:方法将它们的参数判定到所属的实例上,因此无需显示提供,方法和普通函数可以互相绑定,如下;
def Prints():print("function Prins")
person.Print=Prints#函数绑定不能加括号
person.Print()func=person.Print#通过变量引用类方法,实际上func还是绑定到了对象上,因为该方法访问了自身#默认情况下,可以在外部访问对象的特性,可以通过在方法或特性的名字前面加双下划线可以变为私有的
class stu:def __getId(self):print("you can't see id!")def Myget(self):self.__getId(self)
st=stu()
st._stu__getId()#实际上双下划线被解释为单下划线加加类名加私有方法,即这样可以访问#from module import *:不会导入前面有下划线的名字class stuff:num=0#在类的作用域定义了一个可供所用实例访问的变量def init(self):stuff.num+=1
x=stuff()
x.init()
print(x.num)
y=stuff()
y.init()
print(y.num)
#上述x,y操作了同一个变量,但可以将某个实例的该变量重新绑定到其他值上,而屏蔽类范围内的变量#超类:在类定义的类名后的圆括号里指定多个该类的超类,子类可以扩展超类的定义
class Others:def Output(x=None):print("others data!")
class shape:def init(self):self.block=[]def getdata(self,data):return [x for x in data if x not in self.block]
class rect(shape,Others):#多重继承,若shape,Others有同名方法,则shape的方法可用,而Others的该方法被重写(使其不可访问)def init(self):self.block=['A']sh=shape()
sh.init()
print(sh.getdata([1,2,3]))r=rect()
r.init()
r.Output()
print(r.getdata(['A','b','c']))#使用内建函数issubclass(x,y)函数可以查看一个类x是不是另一个类y的子类,返回布尔值
print(issubclass(rect,shape))print(rect.__bases__)#使用__base__或__bases__特性可以查看类的基类print(isinstance(r,rect))#使用函数isinstance(x,y)检查x是否为类y的(间接)实例,返回布尔值print(r.__class__)#使用__class__特性检查一个对象属于哪个类
运行结果: