面向对象程序设计

1)类中创建__init__()方法

①创建类的新实例时,会自动执行该方法

②__init__()方法必须包含且第一个为self的参数,可以有多个参数

  • __inti__(self)一个参数
1 class Geese():
2     "大雁类"
3     def __init__(self):    #构造方法,第一个参数必须有且为self参数,否则会报错
4         print("我是大雁类!")
1 #自动执行构造方法
2 wildGoose = Geese()

  •  __init__(self)多个参数
1 class Geese:
2     "大雁类"
3     def __init__(self,beak,wing,claw):
4         print("我是大雁类,我有以下特征")
5         print(beak)
6         print(wing)
7         print(claw)
1 beak1 = "特征1" 
2 wing1="特征2"
3 claw1 ="特征3"
4 wildGoose = Geese(beak1,wing1,claw1)

 2)创建实例方法并访问

1 def functionName(self,parameterlist):
2        block    

①functionName 方法名,一般用小写字母开头

②self 必要参数,表示类的实例

③parameterlist 用于指定self以为的参数

④ block 方法体,实现具体功能

  • 创建fly()方法
 1 #创建实例方法并访问
 2 class Geese:
 3     "大雁类"
 4     def __init__(self,beak,wing,claw):
 5         print("我是大雁类,我有以下特征")
 6         print(beak)
 7         print(wing)
 8         print(claw)
 9     def fly(self,state):
10         print(state) 
1 # 调用方法
2 beak1 = "特征1" 
3 wing1="特征2"
4 claw1 ="特征3"
5 wildGoose = Geese(beak1,wing1,claw1)
6 wildGoose.fly("我飞行了")

 3)创建数据成员并访问

①数据成员是指在类中定义的变量,即属性,根据定义的位置不同,又可以分为类属性和实例属性。

②类属性可以通过类名或者实例名访问

  • 创建类属性且访问
 1 #创建类中属性
 2 class Geese():
 3     "燕类"
 4     neck = "脖子"      #类属性
 5     wing = "振翅频率高"
 6     leg = ""
 7     def __init__(self):
 8         print("我属于燕类,我有以下特征")
 9         print(Geese.neck)
10         print(Geese.wing)
11         print(Geese.leg)
12         
1 print(geese.neck) #通过实例名访问类属性
2 print(Geese.neck)  #通过类名访问类属性

  •  动态的为类添加属性
1 Geese.beak = "动态添加类属性"
1 geese = Geese()
2 geese.beak

  •  通过实例名称修改实例属性
1 class Geese():
2     def __init__(self):
3         self.neck = "脖子"      
4         print(self.neck)   
1 geese = Geese()
1 geese.neck = '脖子没有天鹅的长'
1 geese.neck

4)访问限制

①_foo: 表示保护类型的成员,只允许类本身及子类进行访问

②不能使用"from module import *"语句导入

  • 创建_neck_swan保护型属性
1 # _foo:
2 class Swan:
3     "天鹅类"
4     _neck_swan = "天鹅的脖子很长"
5     def __init__(self):
6         print("__init__()",Swan._neck_swan)
1 swan = Swan()
2 swan._neck_swan    #保护属性可以通过实例名访问

 ③__fool 私有类型属性,只允许定义该方法的类本身进行访问

④不能通过类的实例进行访问,可以通过“类的实例._类名.__fool”方式访问

  • 创建__neck_swan私有类型属性
1 # __foo:
2 class Swan:
3     "天鹅类"
4     __neck_swan = "天鹅的脖子很长"
5     def __init__(self):
6         print("__init__()",Swan.__neck_swan)
1 swan = Swan()
2 swan._Swan__neck_swan

5)属性

①通过@property(装饰器)将一个方法转换为属性

②@property转换后的属性不能重新复制,否则会报错

1 @property
2 def methodname(self):
3     block
  • 创建area属性
1 class Rect:
2     def __init__(self,width,height):
3         self.width= width
4         self.height=height
5     @property     #将方法转换为属性
6     def area(self):
7         return self.width*self.height
1 rect = Rect(12,12)  #创建类的实例
2 print(rect.area)   #输出属性值

 6)为属性添加安全保护机制

①设置为私有属性__fool时,在类体外不能获取它的值

②设置为保护属性_fool时,可以读但不能修改属性

  • 创建__show私有属性
1 class TVshow:
2     def __init__(self,show):
3         self.__show=show
4     @property
5     def show(self):
6         return self.__show
1 tvshow = TVshow("少年的你")
2 tvshow.show

 修改私有属性时会出错

③通过属性不仅可以将属性设置为只读属性,而且可以为属性设置拦截器,即允许对属性进行修改,但修改时需要遵守一定的约束。

 1 class TVshow:
 2     list_film=['A','B','C']
 3     def __init__(self,show):
 4         self.__show=show
 5     @property
 6     def show(self):
 7         return self.__show
 8     @show.setter   #设置setter方法,让属性可以修改
 9     def show(self,value):
10         if value in TVshow.list_film:
11             self.__show="你选择了%s"%value
12         else:
13             self.__show="你选择的不存在"
1 tvshow.show='f'
2 tvshow.show

1 tvshow.show='B'
2 tvshow.show

 7)继承

1 class ClassName(baseclasslist):
2     """类的帮助信息"""      #文档字符串
3     Statement           #类体
  • 创建水果基类及派生类。然后调用基类中的方法
 1 class Fruit():
 2     color="绿色"
 3     def havest(self,color):
 4         print("水果是%s的"%self.color)
 5         print("水果已经收获")
 6         print("水果原来是%s的"%Fruit.color)
 7         
 8 class Apple(Fruit):
 9         color = '红色'
10         def __init__(self):
11             print("我是苹果")
12 class Orange(Fruit):
13     color = '橙色'
14     def __init__(self):
15         print("\n我是橘子")
1 apple = Apple()
2 apple.havest(apple.color)

1 orange=Orange()
2 orange.havest(orange.color)

 8)方法重写

①当基类中的方法无法满足需求时,可以在派生类中重新定义方法以满足使用

  • 重写橘子类中的方法
 1 class Fruit():
 2     color="绿色"
 3     def havest(self,color):
 4         print("水果是%s的"%self.color)
 5         print("水果已经收获")
 6         print("水果原来是%s的"%Fruit.color)
 7 
 8 class Orange(Fruit):
 9     color="橙色"
10     def __init__(self):
11         print("\n我是橘子")
12     def havest(self,color):
13         print("橘子是%s的"%color)
14         print("橘子已经获得了")
15         print("橘子原来是%s"%Fruit.color)
16 
17 orang = Orange()
18 orang.havest(Orange.color)

 9)派生类中调用基类__init__()的方法

  •  在派生类中定义__init__()方法时,不会自动调用基类的__init__()方法
 1 class Fruit():
 2     def __init__(slef,color):
 3         print("elf.color)")
 4         Fruit.color = color
 5     def havest(self):
 6         print("水果原来是%s的"%Fruit.color)
 7 
 8 class Apple(Fruit):
 9     def __init__(self):
10         print("我是苹果")
11 
12 apple = Apple()
13 apple.havest()

  •  添加super函数调用基类的__init__()方法
 1 class Fruit():
 2     def __init__(slef,color):
 3         print("elf.color)")
 4         Fruit.color = color
 5     def havest(self):
 6         print("水果原来是%s的"%Fruit.color)
 7 
 8 
 9 class Apple(Fruit):
10     color = '红色'
11     def __init__(self):
12         print("我是苹果")
13         super().__init__(Apple.color)   #添加super调用基类__init__()
14 
15 
16 apple = Apple()
17 apple.havest()

posted on 2020-07-03 11:00  LiErRui  阅读(154)  评论(0)    收藏  举报

导航