/*认真研究完这个实例,理解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. 个人的一点小愚见,java有什么优点和缺点

    java是一种面向对象的编程语言,优点是可移植性比较高,最初设计时就是本着一次编写到处执行设计的.可以开发各种应用程序和游戏,不过速度没有c++快,所以一般是不用java来编写应用程序和电脑游戏. j ...

  2. WinFrom和WebFrom的区别

    原文链接:https://blog.csdn.net/sloder/article/details/6145169 一是Winform的定位机制没有Webform丰富,web里有table,div(浮 ...

  3. Day8 - Python基础8 异常处理、反射、单例模式

    本节内容: 1:异常处理 2:反射 3:单例模式 1.异常处理  1.异常简介 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户 ...

  4. navicat使用教程-PJ

    navicat使用教程-PJ Navicat Keygen Patch是一款专门针对Navicat系列软件出品的一款小巧实用,功能强大的破解辅助工具.它能够实现对Navicat全系列版本进行激活破解, ...

  5. 解决 eclipse出现 Address already in use: bind,以及tomcat端口占用

    在项目开发中,有时候我们发现回报这个错:解决 eclipse出现 Address already in use: bind 产生的原因是端口占用,比如你的8080端口,已经有一个进程在访问使用,但是你 ...

  6. 如何在AbpNext项目中使用Mysql数据库

    配置步骤: 1.更改.Web项目的appsettings.json的数据库连接字符串.如:server=0.0.0.0;database=VincentAbpTest;uid=root;pwd=123 ...

  7. SSM框架(Spring + Spring MVC + Mybatis)搭建

    Spring是一个轻量级的框架,用到了注解和自动装配,就是IOC和AOP: SpringMVC是Spring实现的一个Web层,相当于Struts的框架: Mybatis是 一个持久层的框架,在使用上 ...

  8. 并发编程实战之并发下的socket套接字编程

    目录 一.python单线程下实现多个socket并发 1.1 服务端 1.2 客户端 一.python单线程下实现多个socket并发 1.1 服务端 import sys # import soc ...

  9. 在windows环境下部署nuxt项目(线上发布部署)

    因为公司项目需要兼容SEO,同时我们也一直希望能够真正的实现前后端分离,于是毫不犹豫的选择了nuxt. 话说要重构前后端分离真是一个大工程,由于各种原因我们团队花了近两年时间都没有完成,最近才又重启把 ...

  10. Centos7 下cobbler安装及配置

    1.背景介绍 作为运维,在公司经常遇到一些机械性重复工作要做,例如:为新机器装系统,一台两台机器装系统,可以用光盘.U盘等介质安装,1小时也完成了,但是如果有成百台的服务器还要用光盘.U盘去安装,就显 ...