#类,类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
创建类的三要素: 类名,属性,方法(创建时属性或者方法有一个存在,就可以创建) ##使用 class 语句来创建一个新类,class 之后为类的名称并以冒号:结尾 ##类名 类名的每个单词的首字母大写
##方法 在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数 注意:self为调用该方法的对象本身,其中self不是关键字,可以用其他变量代替,不过出于见名知意的意愿,第一个参数尽量用self. #对象,对象:现实实际存在的具体事物 举例:
class Student: #Student为类名 name = '' #在类里面的属性叫类属性,name,age为类属性 age = 0 def learn(self): #方法 print('学生读书学习')#1初始化函数(构造方法) #构造方法在创建对象时执行
#语法: __init__() #init两边双下划线 class Person: def __init__(self,name,sex,age): #创建初始化函数 self.name = name #name,sex,age 为实例属性 self.sex = sex #在方法内写的属性这种属性叫实例属性 self.age = age def introduce(self): print('self—introduce') def eat(self): print('eat food') p1 = Person('zhangsan','men',17) #创建对象 print(p1) #显示对象p1的内存地址 print(p1.name,p1.sex,p1.age) #输出实例属性值 p1.introduce() #调用方法introduce() p1.eat() #调用方法eat()上文的代码直接输出对象,会显示对象的内存地址。其实有一个较好用的__str__方法,并且在打印这个对象的时候,不再打印对象的内存地址,而是打印__str__方法的返回值 #在打印对象的时候执行,可以直接显示对象的属性值
#语法 :__str__() class Person: def __init__(self,name,sex,age): self.name = name self.sex = sex self.age = age def __str__(self): st ="名字:{},性别:{},年龄{}".format(self.name,self.sex,self.age) return st p1 = Person('zhangsan','men',17) #创建对象 print(p1) #显示名字:zhangsan,性别:men,年龄:17语法: __ (两个下划线) #1,在属性前加两个下划线,私有化属性 #2,在自定义方法前加两个下划线,私有化方法 #只有在类内可以访问,在类外不能直接访问私有化部分 作用:保护的对象或类的属性
隐藏具体的细节,对外提供公共的访问方式 作用:保护的对象或类的属性 #1,在类中定义方法,向外输出对象私有化的值(公有化方法) def get(self): return self.__属性名 #2,在类中定义方法,修改对象私有化的值() def set(self,属性名): self.__属性名=属性名
class Student: def __init__(self,name): self.__name= name #私有化属性 def getname(self): return self.__name #返回私有化属性 def setname(self,name): self.__name=name s1 = Student("xiaoming") #创建实例(对象) print(s1.__name) #属性私有化对象不能直接在外访问 #AttributeError: 'Student' object has no attribute '__name' print(s1.getname()) #获得私有化的属性值 s1.setname('xiaofang') #修改私有化的属性 print(s1.getname()) #获取的修改后私有化的属性值子类可以拥有父类公有的部分 #语法: class class_name(父类1,父类2,父类3…):
#方法的重写1,直接修改2,用内置方法用generate 子类继承父类,父类的方法不能满足子类的需求,需要进行方法的重写 语法:把父类的方法重写一遍,并且方法名必须跟父类一致 在python中所有的类都默认继承系统内置的object类
class Animal: #父类或者基类 name='' color='' def run(self): print('跑') def eat(self): print('吃') def talk(self): print('动物在叫') class Dog(Animal): #狗类为动物类的子类 def run(self): #方法的重写 print('狗在跑') def eat(self): print('吃骨头') def talk(self): print('旺旺地叫') print('#-------------------------------------#') spg = Dog() spg.name = '沙皮狗' spg.color = '黄色' print(spg.name,spg.color) spg.run() spg.eat() spg.talk() print('#-------------------------------------#') class Cat(Animal): def run(self): print('猫在跑') def eat(self): print('吃老鼠') def talk(self): print('咪咪地叫') print('#-------------------------------------#') ym = Cat() ym.name = '野猫' ym.color = '白色' print(ym.name,ym.color) ym.run() ym.eat() ym.talk() print('#-------------------------------------#') class Pig(Animal): def run(self): super().run() def eat(self): #对父类的方法进行重写 super().eat() #super()称为超类或者父类 , p1=Pig() p1.eat() p1.run()#多态 形成多态的条件 1,需要要继承 2,需要有方法的重写
#异常:代码语法没有问题,但是程序在运行的过程中出错 当程序某段出现异常后,这个时候这段代码后面的所有代码将不会再执行,程序会终止 异常处理:为了实现程序出现异常后,程序还能继续向下执行,而不会终止 try: 可能出现异常的代码 except: print(‘程序出现了异常’) else: print(‘正常执行程序’) finally: print(‘不管有没有异常都要执行的代码’)
try: n = int(input('请输入数值')) a = [1,2,3,4,5] print(a[3]) 1/1 n = 'kkk' except ValueError: #在except后写具体的异常,不过不是这种异常就管不着 print("请输入数字") except IndexError: print('下标越界') except ZeroDivisionError: print('分母不能为零') else: print('正常执行程序')#自定义异常
class MyException(Exception): #继承内置异常类Exception #本模块的基类 pass class NumErr(MyException): #输入非整型数据将引发异常 def __init__(self,n): #输入的数据 self.n = n def __str__(self): #异常描述 return '只接受整数' def num(n): try: if type(n) != int: raise NumErr(n) #抛出异常 except MyException as me: print(me) else: return n n1 = num('a') #运行后显示只接受整数 n2 = num(2) print(n2) #正常运行,返回2