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的知识。

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

  1. Python基础:17类和实例之一(类属性和实例属性)

    1:类通常在一个模块的顶层进行定义.对于Python来说,声明与定义类是同时进行的. 2:类属性仅与其类相绑定,类数据属性仅当需要有更加“静态”数据类型时才变得有用,这种属性是静态变量.它们表示这些数 ...

  2. 理解Python中的类对象、实例对象、属性、方法

    class Animal(object): # 类对象 age = 0 # 公有类属性 __like = None # 私有类属性 def __init__(self): # 魔法方法 self.na ...

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

    面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可 ...

  4. vue利用watch侦听对象具体的属性 ~ 巧用计算属性computed做中间层

    有时候需要侦听某个对象具体的属性,可以按下面案例进行: <template> <div> <input type="text" v-model=&qu ...

  5. Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性

    什么是对象和类 https://www.cnblogs.com/poloyy/p/15178423.html 什么是 Python 类.类对象.实例对象 https://www.cnblogs.com ...

  6. Swift计算属性

    除存储属性外,类.结构体和枚举可以定义计算属性,计算属性不直接存储值,而是提供一个 getter 来获取值,一个可选的 setter 来间接设置其他属性或变量的值. struct Point { va ...

  7. 前端MVC Vue2学习总结(三)——模板语法、过滤器、计算属性、观察者、Class 与 Style 绑定

    Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解 ...

  8. 初识Vue——计算属性和观察者

    一.计算属性 在模板内使用 1.基础例子 <template> <div class="main"> <div id="reverse_st ...

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

    一.什么是计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example"> ...

随机推荐

  1. 长春理工大学第十四届程序设计竞赛(重现赛)F.Successione di Fixoracci

    链接:https://ac.nowcoder.com/acm/contest/912/F 题意: 动态规划(Dynamic programming,简称dp)是一种通过把原问题分解为相对简单的子问题的 ...

  2. 矩形面积并-扫描线 线段树 离散化 模板-poj1151 hdu1542

    今天刚看到这个模板我是懵逼的,这个线段树既没有建树,也没有查询,只有一个update,而且区间成段更新也没有lazy标记....研究了一下午,我突然我发现我以前根本不懂扫描线,之所以没有lazy标记, ...

  3. NET Core中使用Dapper操作Oracle存储过程

    .NET Core中使用Dapper操作Oracle存储过程最佳实践   为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为Or ...

  4. 如何更改Android的默认虚拟机地址

    第一种,虚拟机已经建立 1)找到虚拟机.ini这个文件,例如: zhai.ini 寻找方法:你可以在运行SDK Manager时看到最上面显示的虚拟机存放地址 例如显示: List of existi ...

  5. P4869 罪犯分组

    思路: 明显的dp,虽然我想到了二进制模拟,想到了转移,但还是先看了题解,原来真是这样,,,,不是第三题吗? 用f[i]表示,对于前i个罪犯最少需要分几组. 对于每个状态用二进制表示,第i位上1,0表 ...

  6. 使用CRA开发的基于React的UI组件发布到内网NPM上去

    前言:构建的ES组件使用CNPM发布内网上过程 1. 使用Create-React-APP开的组件 如果直接上传到NPM,你引用的时候会报: You may need an appropriate l ...

  7. (译)Minimal Shader(最小的着色器)

    (原文:https://en.wikibooks.org/wiki/Cg_Programming/Unity/Minimal_Shader) This tutorial covers the basi ...

  8. js push(),pop(),shift(),unshift()

    以前没有太在意这些,这几天看<Javascript 设计模式与开发实践>(不得不说这是一本好书) 发现总是会用到这几个函数,可是有什么区别呢?? 简单来说是两套东西(数据结构时老师详细的讲 ...

  9. Android端WebRTC点对点互连

    项目准备 信令服务器代码:https://github.com/matthewYang92/WebRtcServer(代码改自ProjectRTC) 安装Node.js 进入项目根目录,命令行:npm ...

  10. 网站安全webshell扫描

    做个记录,使用Detector进行php网站webshell扫描 开源项目托管地址:https://github.com/emposha/PHP-Shell-Detector安装使用都很简单