/*认真研究完这个实例,理解python面向对象编程的方法*/
class Person:
"""人员信息"""
# 姓名(共有属性)
name = ''
# 年龄(共有属性)
age = 0 #定义构造函数
def __init__(self, name='', age=0):
self.name = name
self.age = age # 重载专有方法: __str__
def __str__(self):
return "这里重载了 __str__ 专有方法, " + str({'name': self.name, 'age': self.age}) def set_age(self, age):
self.age = age class Account:
"""账户信息"""
# 账户余额(私有属性)
__balance = 0
# 所有账户总额
__total_balance = 0 # 获取账户余额
# self 必须是方法的第一个参数
def balance(self):
return self.__balance '''一共有三种方式定义类的方法
第一种:不加修饰,绑定的是当前的实例
增加账户余额'''
def balance_add(self, cost):
# self 访问的是本实例
self.__balance += cost
# self.__class__ 可以访问类
self.__class__.__total_balance += cost '''
第二种:用@classmethod来修饰,绑定的是类
类方法(用@classmethod标识,第一个参数为 cls)
'''
@classmethod
def total_balance(cls):
return cls.__total_balance '''
第二种:用@staticmethod修饰,不绑定
静态方法(用 @staticmethod 标识,不需要类参数或实例参数)
'''
@staticmethod
def exchange(a, b):
return b, a class Teacher(Person, Account):
"""教师"""
# 班级名称,受保护的属性
_class_name = '' def __init__(self, name):
# 第一种重载父类__init__()构造方法
# super(子类,self).__init__(参数1,参数2,....)
super(Teacher, self).__init__(name) @classmethod
def set_class_name(cls,class_name):
cls._class_name = class_name def get_info(self):
# 以字典的形式返回个人信息
return {
'name': self.name, # 此处访问的是父类Person的属性值
'age': self.age,
'class_name': self._class_name,
'balance': self.balance(), # 此处调用的是子类重载过的方法
} # 方法重载
def balance(self):
# Account.__balance 为私有属性,子类无法访问,所以父类提供方法进行访问
return Account.balance(self) * 1.1 class Student(Person, Account):
"""学生"""
_teacher_name = '' def __init__(self, name, age=18):
# 第二种重载父类__init__()构造方法
# 父类名称.__init__(self,参数1,参数2,...)
Person.__init__(self, name, age) @classmethod
def set_teacher_name(cls,teacher_name):
cls._teacher_name = teacher_name def get_info(self):
# 以字典的形式返回个人信息
return {
'name': self.name, # 此处访问的是父类Person的属性值
'age': self.age,
'teacher_name': self._teacher_name,
'balance': self.balance(),
} # 教师 John
john = Teacher('John')
john.set_class_name('CS2018')
john.balance_add(20)
john.set_age(36) # 子类的实例可以直接调用父类的方法
print("John's info:", john.get_info()) # 学生 Mary
mary = Student('Mary', 18)
mary.balance_add(18)
mary.set_teacher_name('john')
print("Mary's info:", mary.get_info()) # 学生 Fake
fake = Student('Fake')
fake.balance_add(30)
print("Fake's info", fake.get_info()) # 三种不同的方式调用静态方法
print("john.exchange('a', 'b'):", john.exchange('a', 'b'))
print('Teacher.exchange(1, 2)', Teacher.exchange(1, 2))
print('Account.exchange(10, 20):', Account.exchange(10, 20)) # 类方法、类属性
print('Account.total_balance():', Account.total_balance())
print('Teacher.total_balance():', Teacher.total_balance())
print('Student.total_balance():', Student.total_balance()) # 重载专有方法
print(john)
print(mary)
print(fake)

输出:

John's info: {'name': 'John', 'age': 36, 'balance': 22.0, 'class_name': 'CS2018'}
Mary's info: {'teacher_name': 'john', 'name': 'Mary', 'age': 18, 'balance': 18}
Fake's info {'teacher_name': 'john', 'name': 'Fake', 'age': 18, 'balance': 30}
john.exchange('a', 'b'): ('b', 'a')
Teacher.exchange(1, 2) (2, 1)
Account.exchange(10, 20): (20, 10)
Account.total_balance(): 0
Teacher.total_balance(): 20
Student.total_balance(): 48
这里重载了 __str__ 专有方法, {'name': 'John', 'age': 36}
这里重载了 __str__ 专有方法, {'name': 'Mary', 'age': 18}
这里重载了 __str__ 专有方法, {'name': 'Fake', 'age': 18}

Python3面向对象编程实例的更多相关文章

  1. js原生设计模式——3简单工厂模式\js面向对象编程实例

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  2. python面向对象编程实例解析

    1. 类和函数 面向对象编程的例子: #!/usr/bin/env python # -*- coding: utf-8 -*- class Person(object): #在属性和变量的前面增加“ ...

  3. 大数据笔记(二十四)——Scala面向对象编程实例

    ===================== Scala语言的面向对象编程 ======================== 一.面向对象的基本概念:把数据和操作数据的方法放到一起,作为一个整体(类 c ...

  4. Python3 面向对象编程

    小案例: #!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author:Bert import sys class Role(object): n=&qu ...

  5. php 面向对象编程实例 __construct 和 __destruct 区别

    大多数类都有一种称为构造函数的特殊方法.当创建一个对象时,它将自动调用构造函数,也就是使用new这个关键字来实例化对象的时候自动调用构造方 法.构 造函数的声明与其它操作的声明一样,只是其名称必须是_ ...

  6. python3 面向对象编程--类的封装和继承

    #python3import refrom urllib import requestimport os class PosterSpider(object):     def __init__(se ...

  7. Python3 面向对象编程高级语法

    1.静态方法: #!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author:CarsonLi class Dog(object): def __init ...

  8. javascript 仿面向对象编程实例代码(私有,公共变量。。。)

    //定义一个javascript类 function JsClass(privateParam,publicParam){//构造函数 var priMember = privateParam; // ...

  9. python面向对象编程实例

    1.编写程序, 编写一个学生类, 要求有一个计数器的属性, 统计总共实例化了多少个学生 class Student: """学生类""" c ...

随机推荐

  1. Linux自动同步时间

    一.安装时间同步工具 yum -y install ntp 二.同步时间 1.修改时区 cp -y /usr/share/zoneinfo/Asia/Shanghai /etc/localtime v ...

  2. 初学Python:Python的发展历史及下载安装

    Python作为一种计算机程序设计语言,自20世纪90年代初诞生至如今被人们逐渐悉知,经过版本更新以及功能添加,已广泛应用于各种独立的.大型项目的开发.Python 已经成为最受欢迎的程序设计语言之一 ...

  3. 如何在python中使用Elasticsearch

    什么是 Elasticsearch ​ 想查数据就免不了搜索,搜索就离不开搜索引擎,百度.谷歌都是一个非常庞大复杂的搜索引擎,他们几乎索引了互联网上开放的所有网页和数据.然而对于我们自己的业务数据来说 ...

  4. 使用canal增量同步mysql数据库信息到ElasticSearch

    本文介绍如何使用canal增量同步mysql数据库信息到ElasticSearch.(注意:是增量!!!) 1.简介 1.1 canal介绍 Canal是一个基于MySQL二进制日志的高性能数据同步系 ...

  5. linux--解决anaconda升级pip问题

    Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项. 在用pip install命令安装东西时,有时会提示如下错误:升级pip You ...

  6. linux与ubuntu下vsftp的安装使用

    vsftp工具是linux与类linux系统上常用的ftp传输工具,按百度上的说法,它的不同点与好处有九点,不明觉厉,有兴趣的可以深入验证: 一.它是一个安全.高速.稳定的FTP服务器: 二.它可以做 ...

  7. Swiper实现轮播图效果

    为了实现轮播图(carousel)效果或左右滑动显示不同的内容,我们采用Swiper来实现. 需要引入swiper.min.css和swiper.min.js,文件可从https://github.c ...

  8. 使用os模块动态获取目录或文件路径

    在接口自动化测试框架中,我们的代码除了能在本地运行,也能在不在修改代码的前提下在其他的环境下能够运行,这样才能达到高复用性和低维护成本,我们在接口测试的模块调用中,会定义很多相关路径,而这些路径必须使 ...

  9. 遍历json数据的几种方式

    json(JavaScript Object Notation),json是一种多用于存储和交换文本信息的语法.他能够进行数据的传输,通常和ajax一起使用.它具有体积小.速度快,易解析等诸多优点. ...

  10. oracle学习笔记(十七) PL/SQL高级应用

    PL/SQL高级应用 动态SQL 在PL/SQL中,不能直接执行DDL(create,alter,drop),得使用动态SQL,当然,除了DDL,动态SQL也可以执行DML(select,insert ...