类和实例
类是抽象的模版,例如汽车;而实例则是拥有相同方法的类的实现,例如汽车里面有大众、宝马、奔驰等等,这些车都能在地面上跑,但是它们的具体数据可以不一样。
calss Student(object) #object是所有类的父类,如果没有继承的父类就填该类pass #定义类是通过pass关键字,之后可以实例化具体的类calss Student(object) #类的实例 def __init__(self,name,age)#特殊函数__init__ self.name = name self.age = age def speak(self,word = ‘nihao’) print(word + self.name)
python的实例是动态语言,所以允许用户自由绑定任何数据,例子:
student = Student(syz,18)student.score = 100
访问限制
对于不想让外部访问的变量或者数据,可以定义私有变量,变量前面添加两个下划线__name,那么将不能通过student.__name的方式直接访问,实现原理是在内部生成_Student__name变量代替__name变量,但是此时注意,不要认为调用student.__name = syz的方式修改,因为此时相当于添加了一个__name的变量,而程序的self__的变量并没有变。
为了得到或者修改私有变量,需要定义修改函数或者获取函数
def set_name(self,name): self.__name = namedef get_name(self): return self.__name
注意:__abc__前后都有双下划线的变量时特殊变量,函数可以直接访问,注意私有变量不要这样定义。
私有变量跟前面的内部变量还是有区别的,因为前边只加一个下划线的变量属于内部变量,原则上还是可以被外部变量访问的。
继承和多态
子类定义可以继承父类,并且可以在父类的基础上做修改,从而体现多态性。
例子:
def Animal(object): def run(self): print(‘I’m running’)def Dog(Animal):def run(self): print(‘A dog running’) passdef Cat(Animal):def run(self): print(‘A cat running’) pass
鸭子类型,只要有相应的方法,就看做是类似的。只要会跑就把他看做鸭子
获取对象信息
isinstance(‘123’,str)
True
getattr() setattr() hasattr()
# 首先你有一个command.py文件,内容如下,这里我们假若它后面还有100个方法class MyObject(object): def __init__(self): self.x = 9 def add(self): return self.x + self.x def pow(self): return self.x * self.x def sub(self): return self.x - self.x def div(self): return self.x / self.x# 然后我们有一个入口文件 exec.py,要根据用户的输入来执行后端的操作from command import MyObjectcomputer=MyObject()def run(): inp = input('method>') if inp == 'add': computer.add() elif inp == 'sub': computer.sub() elif inp == 'div': computer.div() elif inp == 'pow': computer.pow() else: print('404')
上面使用了if来进行判断,那么假若我的command里面真的有100个方法,那我总不可能写100次判断吧,所以这里我们就会用到python的反射特性,看下面的代码
from command import MyObjectcomputer=MyObject()def run(x): inp = input('method>') # 判断是否有这个属性 if hasattr(computer,inp): # 有就获取然后赋值给新的变量 func = getattr(computer,inp) print(func()) else: # 没有我们来set一个 setattr(computer,inp,lambda x:x+1) func = getattr(computer,inp) print(func(x))if __name__ == '__main__': run(10)