目录
类的定义与实例化
class ClassName:
'''类的帮助信息'''
statement
ClassName(parameterlist)
“魔术”方法----__init__()
创建类后会自动创建一个 __init__() 方法,每当创建一个实例后都会自动执行他。
该方法必须包含一个 self 参数,self 是指向实例本身的一个引用,用于访问类中的属性和方法,
方法调用的时候会自动传递实际参数 self
class Geese:
'''大雁类'''
def __init__(self): # 构造方法
print("我是大雁类!")
wildGoose = Geese() # 创建大雁类的实例
我是大雁类!
class Geese:
'''大雁类'''
def __init__(self,beak,wing,claw): # 构造方法
print("我是大雁类!我有以下特征:")
print(beak) # 输出喙的特征
print(wing) # 输出翅膀的特征
print(claw) # 输出爪子的特征
beak_1 = "喙的基部较高,长度和头部的长度几乎相等" # 喙的特征
wing_1 = "翅膀长而尖" # 翅膀的特征
claw_1 = "爪子是蹼状的" # 爪子的特征
wildGoose = Geese(beak_1,wing_1,claw_1) # 创建大雁类的实例
我是大雁类!我有以下特征:
喙的基部较高,长度和头部的长度几乎相等
翅膀长而尖
爪子是蹼状的
创建类的成员并访问
def functionName(self,parameterlist):
block
调用 实例名称和点
instanceName.functionName(parametervalue)
类属性:定义在类中,在函数体外;可以通过类名称 或者 实例名访问
class Geese:
'''雁类'''
neck = "脖子较长" # 定义类属性(脖子)
wing = "振翅频率高" # 定义类属性(翅膀)
leg = "腿位于身份的中心支点,行走自如" # 定义类属性(腿)
def __init__(self): # 实例方法(相当于构造方法)
print("我属于雁类!我有以下特征:")
print(Geese.neck) # 输出脖子的特征
print(Geese.wing) # 输出翅膀的特征
print(Geese.leg) # 输出腿的特征
geese = Geese() # 实例化一个雁类的对象
我属于雁类!我有以下特征:
脖子较长
振翅频率高
腿位于身份的中心支点,行走自如
实例属性:定义在类的方法中的属性,只能通过实例名访问,只作用于当前实例
class Geese:
'''雁类'''
def __init__(self): # 实例方法(相当于构造方法)
self.neck = "脖子较长" # 定义实例属性(脖子)
self.wing = "振翅频率高" # 定义实例属性(翅膀)
self.leg = "腿位于身份的中心支点,行走自如" # 定义实例属性(腿)
print("我属于雁类!我有以下特征:")
print(self.neck) # 输出脖子的特征
print(self.wing) # 输出翅膀的特征
print(self.leg) # 输出腿的特征
geese = Geese() # 实例化一个雁类的对象
我属于雁类!我有以下特征:
脖子较长
振翅频率高
腿位于身份的中心支点,行走自如
实例属性可以通过实例名称修改
class Geese:
'''雁类'''
def __init__(self): # 实例方法(相当于构造方法)
self.neck = "脖子较长" # 定义实例属性(脖子)
print(self.neck) # 输出脖子的特征
goose1 = Geese() # 创建Geese类的实例1
goose2 = Geese() # 创建Geese类的实例2
goose1.neck = "脖子没有天鹅的长" # 修改实例属性
print("goose1的neck属性:",goose1.neck)
print("goose2的neck属性:",goose2.neck)
geese = Geese() # 实例化一个雁类的对象
脖子较长
脖子较长
goose1的neck属性: 脖子没有天鹅的长
goose2的neck属性: 脖子较长
脖子较长
_foo 单下划线开头的表示保护类型的成员,只允许本身和子类进行访问
class Swan:
'''天鹅类'''
_neck_swan = '天鹅的脖子很长' # 定义私有属性
def __init__(self):
print("__init__():", Swan._neck_swan) # 在实例方法中访问私有属性
swan = Swan() # 创建Swan类的实例
print("直接访问:" , swan._neck_swan) # 保护属性可以通过实例名访问
__init__(): 天鹅的脖子很长
直接访问: 天鹅的脖子很长
__foo 双下划线开头的表示private私有 类型的成员,只允许定义该方法的类本身进行访问
class Swan:
'''天鹅类'''
__neck_swan = '天鹅的脖子很长' # 定义私有属性
def __init__(self):
print("__init__():", Swan.__neck_swan) # 在实例方法中访问私有属性
swan = Swan() # 创建Swan类的实例
print("加入类名:" , swan._Swan__neck_swan) # 私有属性可通过“实例名.类名__**”访问
print("直接访问:" , swan.__neck_swan) # 不能通过实例名访问,出错
__init__(): 天鹅的脖子很长
加入类名: 天鹅的脖子很长
Traceback (most recent call last):
File "E:/PyCharm project/hello.py", line 8, in <module>
print("直接访问:" , swan.__neck_swan) # 不能通过实例名访问,出错
AttributeError: 'Swan' object has no attribute '__neck_swan'
print("加入类名:" , swan._Swan__neck_swan) # 私有属性可通过“实例名.类名__**”访问
属性 @property
@property 创建用于计算的属性
@property
def methodname(self):
block
class Rect:
def __init__(self,width,height):
self.width = width # 矩形的宽
self.height = height # 矩形的高
@property # 将方法转换为属性
def area(self): # 计算矩形的面积的方法
return self.width*self.height # 返回矩形的面积
rect = Rect(800,600) # 创建类的实例
print("面积为:",rect.area) # 输出属性的值
面积为: 480000
保护机制 @property 实现 只读 私有属性
class TVshow: # 定义电视节目类
def __init__(self,show):
self.__show = show
@property # 将方法转换为属性
def show(self): # 定义show()方法
return self.__show # 返回私有属性的值
tvshow = TVshow("正在播放《战狼2》") # 创建类的实例
print("默认:",tvshow.show) # 获取属性值
默认: 正在播放《战狼2》
继承
class ClassName(baseclasslist)
'''类的帮助信息'''
statement
baseclasslist 指定要继承的基类
派生类中可以 进行 方法重写
派生类中调用基类__init__()的方法:
使用super()函数
super().__init__()
***************************************************
12.5 任务二
from datetime import datetime
class Medicine:
name = ''
price = 0
PD = ''
Exp = ''
def __init__(self,name,price,PD,Exp):
self.name = name
self.price = price
self.PD = PD
self.Exp = Exp
def get_name(self):
return self.name
def get_GP(self):
start = datetime.strptime(self.PD,'%Y-%m-%d')
end = datetime.strptime(self.Exp,'%Y-%m-%d')
return (end-start).days
medicine = Medicine('格列宁' , 1860, '2018-5-1', '2019-12-1')
# medicine = Medicine(name='格列宁' ,price = 1860, PD = '2018-5-1', Exp= '2019-12-1')
name = medicine.get_name()
GP = medicine.get_GP()
print('药品名称:{}'.format(name))
print('药品保质期:{}天'.format(GP))
药品名称:格列宁
药品保质期:579天