python 面向对象
程序员文章站
2022-06-23 23:11:07
类的使用示例: 可通过类名直接访问成员变量,但访问到的只是初始值: 不推荐使用类名直接访问成员变量。 在python中,私有的成员变量、方法以__(2个下划线)开头。 私有的成员变量、方法只能在类中访问、调用。 公有的成员变量、方法既可以在类中访问、调用,也可在在类外通过对象来访问、调用。 在类外, ......
类的使用示例:
class student: name="" #类的成员变量,公有的 age=0 #python中定义变量时必须要赋值 def __init__(self,name,age): #构造函数 self.name=name self.age=age def getage(self): #类中所有的方法定义时都必须要带参数self,且self必须是形参表的第一个参数。 return self.age #self表示类的当前实例,相当于c++、java中的this def out(self): #不管函数体中用不用self,形参表中都必须要加上self。传参时不传递self参数。 print("ok") student=student("张三",20) #创建类的一个实例 print(student.name) #访问公有成员变量 print(student.getage()) #调用公有方法
可通过类名直接访问成员变量,但访问到的只是初始值:
class student: name="" age=0 def __init__(self,name,age): self.name=name self.age=age def getage(self): return self.age def out(self): print("ok") student=student("张三",20) print(student.age) #20 通过对象来访问成员变量 print(student.getage()) #20 通过对象来访问 print(student.age) #0 通过类名直接访问成员变量,访问到的只是初始值
不推荐使用类名直接访问成员变量。
在python中,私有的成员变量、方法以__(2个下划线)开头。
私有的成员变量、方法只能在类中访问、调用。
公有的成员变量、方法既可以在类中访问、调用,也可在在类外通过对象来访问、调用。
在类外,可通过类名直接访问公有的成员变量,但访问到的是初始值。
在类外,通过类名只能访问到公有的成员变量,不能访问到私有的成员变量,不能访问到类中的方法。
class student: __name="" #前缀__表示此成员变量|方法是私有的 __age=0 #私有的成员变量,只能在类中被访问、使用 def __init__(self,name,age): self.__name=name self.__age=age def getage(self): return self.__age def __out(self): #私有方法,只能在类中被调用 print("ok")
类中有一系列预定义的方法名:
- __init__ : 构造函数
- __del__ : 析构函数
- __repr__ : 打印,转换
- __setitem__ : 按照索引赋值
- __getitem__: 按照索引获取值
- __len__: 获取长度
- __cmp__: 比较运算
- __call__: 函数调用
- __add__: 加法运算
- __sub__: 减法运算
- __mul__: 乘法运算
- __truediv__: 除法运算
- __mod__: 求余运算
- __pow__: 乘方运算
构造函数:
class student: __name="" __age=0 def __init__(self,name,age): #构造函数 self.__name=name self.__age=age def getage(self): return self.__age def getname(self): return self.__name student=student("张三",20) print(student.getname()) #张三 print(student.getage()) #20
class student: __name="" __age=0 def __int__(self): # 空参构造函数 pass def __init_(self,name): #一个参数的构造函数 self.__name=name def __init__(self,name,age): #2个参数的构造函数 self.__name=name self.__age=age def getname(self): return self.__name def getage(self): return self.__age # student=student("张三",20) # print(student.getname(),student.getage()) #张三 20 #student=student() #报错 typeerror: __init__() missing 2 required positional arguments: 'name' and 'age' #print(student.getname(),student.getage()) student=student("李四") #报错 typeerror: __init__() missing 1 required positional argument: 'age' print(student.getname(),student.getage()) """ python中可以定义多个构造函数,但: 如果有给所有成员变量赋值的构造器时,只能使用这个构造器,如果没有这个构造器,则只能使用空参构造器。 其他构造器无效。 """
运算符重载:
class student: __name="" __age=0 def __init__(self,name,age): #构造函数。 self.__name=name self.__age=age def __add__(self, other): #运算符重载,加法运算 result=student("",0) #如果有给全部成员变量赋值的构造器,就必须使用这个构造器,必须传递全部参数 result.__name=self.__name+other.__name result.__age=self.__age+other.__age return result def getname(self): return self.__name def getage(self): return self.__age student1=student("张三",20) student2=student("李四",22) student=student1+student2 #也可以写成 student=student1.__add__(student2) print(student.getname()) #张三李四 print(student.getage()) #42
继承
class 子类(父类): #单继承 类体
class 子类(父类1,父类2,父类3,...): #python支持多继承。逗号分隔。 类体
重写方法:
class father: def out(self): print("father") class son(father): def out(self): #重写方法 print("son") son=son() son.out() #调用子类的方法 son super(son,son).out() #调用父类中的方法 father """ super(子类名, 子类对象) 表示这个子类对象对应的父类对象 如果是在子类类体(定义)中调用,子类对对象可以用self表示: super(子类名, self) """
子类的构造器:
class father: def __init__(self): print("father_init") class son(father): def __init__(self): print("son_init") son=son() """ 如果子类有自己的构造器,则创建子类对象时,会自动调用子类的构造器,不会自动调用父类的构造器。(可以在子类的构造器中手动调用父类的构造器) 如果子类没有自己的构造器,则创建子类对象时,会自动调用父类的构造器。 """
上一篇: DesignPattern系列__08UML相关知识
下一篇: Android 属性动画实战