《python从入门到项目实践》第12章 类和对象

目录

类的定义与实例化

 “魔术”方法----__init__()

 创建类的成员并访问

属性  @property

 继承


类的定义与实例化

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天

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值