Python中类的声明,使用,属性,实例属性,计算属性及继承,重写

Python中的类的定义以及使用:

类的定义:

定义类  在Python中,类的定义使用class关键字来实现 语法如下:
class className:
    "类的注释"
    类的实体 (当没有实体时 使用pass代替)

下面定义一个鸟类;

class flyBord:
    """鸟类"""
    pass       #这里我们并没有实体所以我们使用pass代替

这就是一个类的最基本的定义

类中的__init__函数:类似于java中的构造函数,以及类的使用
实例如下:

#eg:定义一个狗类
class Dog:
    def __init__(self):      #方法名为 __init__ 形参必须要带一个self 当然也可以别名 self习惯使然
        print("我是一只小狗")

#创建一个实例
dog_1 = Dog()           #创建类的实例,也就是调用这个类

注意这里的方法__intit__(self)下划线是前面两个下划线,后面两个下划线,并不是一个下划线。

输出结果如下:

我是一只小狗

当一个类的实例被创建出来的时候__init__(self)方法就会被自动调用,类似于java,C#中的构造函数。

类中的类属性与实例属性:

实例如下:

#eg:定义一个猫类

class cat:
  """猫类"""
    name = "小花"   #类属性 可以通过类来调用
    # __init__为实例方法
    def __init__(self):     #self为实例参数
         self.name_1 = "小强"  #实例属性 定义时必须要用实例参数.出来

那么接下来我们分别调用它的类属性,实例属性

#cat_1为实例名称
cat_1 = cat()
print(cat.name)         #调用它的类属性print(cat_1.name)       #通过实例参数调用类属性print(cat_1.name_1)     #调用实例属性

接下来我们看一下输出结果:

小花
小花
小强

可以根据调用时使用的属性以及输出结果看到:

通过类名只可以调用类属性
通过实例名称可以调用类属性也可以调用实例属性

计算属性
在Python中,可以通过@property(装饰器)将一个方法转换为属性,从而实现用于计算的属性。
将方法转换为属性后,可以直接通过方法名来访问方法,而不需要再添加一对小括号"()",这样可以让代码更加简洁

#通过@property创建用于计算的属性的语法格式如下:
#eg:
"""
@property     @property 装饰器
def methodname(self):     methodname:用于指定方法名,一般使用小写字母开头。该名称最后将作为创建的属性。 self:必要参数
    block   block:方法体,实现具体的功能,可以通过pass代替
"""

下面定义一个类来具体实现矩形面积的求法:

#eg:
class Rect:
    def __init__(self,height,width):
        self.height = height
        self.width = width
    @property
    def arae(self):
        return self.height*self.width

创建这个类的实例并且调用已经被写成计算属性的方法arae:

temp = Rect(800,600)
print(temp.arae)

输出结果如下:

480000

可以看到我们在通过temp实例调用方法arae()时并没有带小括号(),因为arae()方法已经被我们写成了计算属性

继承的定义:

在编写类的时候,并不是每一次都要从空白开始编写,当要编写的类和另外一个已经存在的类存在一定的继承关系时,就可以通过继承来达到代码的重用的目的,提高开发效率。就如同在自然现象中的我们每个人都从父辈祖辈哪里继承了很多的特征,但又不完全是他们,我们又有自己的一些特征,在编程中被继承的类叫做父类或基类,新的类叫做基类或者派生类。

继承的语法:


"""class ClassName(baseclasslist):    #ClassName派生类的类名   baseclasslist:被继承的父类;被继承的父类可以有多个    ‘‘‘类的帮助文档‘‘‘                帮助文档 可以在创建对象的时候输入类名和‘(‘时可以查看    statement                       类体 可以使用pass替代"""
 

下面定义两个父类在(父类中创建一个实例函数)和一个子类 子类继承父类:

class father:
    def __init__(self):
        print("我是父亲")
class mather:
    def __init__(self):
        print("我是母亲")

class son(father,mather):
    pass

创建子类son的实例,并查看输出结果。

son = son()  

#输出结果:
我是父亲

可以看到子类是没有实例函数__init__()的,

但是创建实例的时候依然有输出结果,并且是调用了父类father的实例函数,

但是并没有调用父类mather类的实例函数,可见当子类继承了父类之后,

子类也会继承父类的函数,包括实例函数,但是只会继承第一个父类的函数

方法的重写:
当子类继承了父类的函数之后,函数是子类需要的,但是函数体又不是子类需要的。
这时子类就要对父类的方法进行重写

下面直接进行实例代码:

#eg:

class Fruit:
    """水果类"""
    color = "绿色"
    def harvest(self,color):
        print("水果是"+color+"的!")
        print("水果已经收获.....")
        print("水果原来是"+self.color+"的!")

class Orange(Fruit):
    """橘子类继承自水果类"""
    color = "橙色"
    def __init__(self):
        print("\n我是橙子")
    def harvest(self,color):          #重写父类函数harvest
        print("橘子是"+color+"的!")
        print("橙子已经收获......")
        print("橙子原来是"+self.color+"的!")

#创建Orange的对象

oran = Orange()
oran.harvest("黄色")

输出结果如下:

我是橙子                  #子类Orange的构造函数
橘子是黄色的!
橙子已经收获......
橙子原来是橙色的!
#这三句是子类继承自父类Fruit的函数,但是函数体与父类的函数体不同也就是我们说的重写

可以看到我们调用了继承自Fruit的方法harvest但是输出内容与父类的方法体不同,是因为我们在子类Orange中将harvest函数的函数体重写了

下面直接来一个小练习,废话不多说直接上代码:

"""
练习 设计药品类medicine
"""
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

med = Medicine(name=‘格列宁‘,price=25000,PD=‘2018-9-8‘,Exp=‘2020-9-8‘)
name = med.get_name()
GP = med.get_GP()
print(name)
print(GP)

输出结果:

格列宁
731

下一章咱们讲讲字符串的一些使用与注意事项

本博客皆是本人在自学Python期间的学习笔记,与一些学习心得,希望大家喜欢,每周一凌晨更新关于Python的知识。

原文地址:https://www.cnblogs.com/gongdada/p/10891878.html

时间: 2024-11-07 17:49:32

Python中类的声明,使用,属性,实例属性,计算属性及继承,重写的相关文章

python中类(class)和实例(instance)

面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的方法,但各自的数据可能不同. 仍以Student类为例,在Python中,定义类是通过class关键字: class Student(object): pass class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的,继承的概念我们后面再

v-once指令、v-cloak指令、条件指令家族、原义指令、循环指令、todolist案例、实例成员-符号、实例成员-计算属性、实例成员-属性监听、监听的案例、局部组件、全局组件、组件交互(父传子、子传父)

v-once指令: v-once:单独使用,限制的标签内容一旦赋值,便不可被动更改(如果是输入框,可以主动修改) <div id="app"> <input type="text" v-model="msg"> <!-- 一旦赋值,只可主动更改 --> <input type="text" v-model="msg" v-once> <p>{{ m

Ember.js 入门指南——计算属性(compute properties)

本系列文章全部从(http://ibeginner.sinaapp.com/)迁移过来,欢迎访问原网站. 1,简单的计算属性 简单地来说,计算属性就是将函数声明为属性.其实就是就是在类扩展的时候为类定义的属性. Person = Ember.Object.extend({     firstName: null,     lastName: null,         //  fullName 就是一个计算属性     fullName: Ember.computed('firstName', 

Swift 的存储属性和计算属性

属性将值跟特定的类.结构或枚举关联.存储属性存储常量或变量作为实例的一部分,计算属性计算(而不是存储)一个值.计算属性可以用于类.结构体和枚举里,存储属性只能用于类和结构体. 存储属性和计算属性通常用于特定类型的实例,但是,属性也可以直接用于类型本身,这种属性称为类型属性. 另外,还可以定义属性监视器来监控属性值的变化,以此来触发一个自定义的操作.属性监视器可以添加到自己写的存储属性上,也可以添加到从父类继承的属性上. 存储属性 简单来说,一个存储属性就是存储在特定类或结构体的实例里的一个常量或

Vue计算属性和监听属性

一.计算属性 计算属性关键词: computed.计算属性在处理一些复杂逻辑时是很有用的. 可以看下以下反转字符串的例子: <div id="app"> {{ message.split('').reverse().join('') }} </div> //模板变的很复杂起来,也不容易看懂理解 使用了计算属性的实例: <div id="app"> <p>原始字符串: {{ message }}</p> &l

vue计算属性详解——小白速会

每天学习一点点 编程PDF电子书.视频教程免费下载: http://www.shitanlife.com/code 一.什么是计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example"> {{ message.split('').reverse().join('') }} </div> 这里的表达式包含3个操作,并不是很清晰,所以遇到复杂逻辑时应该使用Vue特带的

VueJs(7)---计算属性和侦听器

计算属性和侦听器 一. 概述 计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example"> {{ message.split('').reverse().join('') }} </div> 在这个地方,模板不再是简单的声明式逻辑.你必须看一段时间才能意识到,这里是想要显示变量 message 的翻转字符串.当你想要在模板中多次引用此处的翻转字符串时,就会更加难以

Vue.js学习日记(3)——计算属性和侦听器

1.计算属性 模板不仅可以是简单的声明式逻辑,也可以是较为复杂的表达式. <div id="element"> <!--简单声明--> {{message}} <!--复杂表达式,表示变量message的翻转字符串--> {{message.split('').reverse().join('')}} </id> 如果表达式过于复杂,将不利于直接理解.当需要在模板中多次引用message的翻转字符串时,操作也会变得繁琐. 所以,对于任何复

Vue中的计算属性

一.什么是计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护. 二.计算属性的用法 在一个计算属性里可以完成各种复杂的逻辑,包括运算.函数调用等,只要最终返回一个结果就可以. <div id="example"> <p>Original message: "{{ message }}"</p> <p>Computed reversed message: &