类:一类事物的抽象化。概念:

类的变量(属于类的变量,定义在类的开始处)  成员变量(self.变量)

类的方法( @classmethod,cls参数)   成员方法( self参数 )  静态方法(@staticmethod )

私有变量 私有方法 (__打头的变量或方法,外部不可调用。类定义内部可调用)

对象:类的实例化,调用构造函数__init__()

#coding:utf-8
#/usr/bin/python
"""
2018-11-17
dinghanhua
类与对象实例化
"""
import datetime '''类定义'''
class student: school = '大树幼儿园' #类变量
__lastchangetime = '' #私有变量
'''类变量,属于类自己的变量。实例化对象时拷贝副本给对象。
可通过类名或对象访问,但对象.类对象改变只对当前对象生效,通过类名改变对才对类生效''' def __init__(self,name,grade,id,phone=''): #构造函数
self.name = name #成员变量
self.grade = grade
self.id = id
self.__phone = phone #成员私有变量
self.__score = 0 def print_info(self): #对象方法 self指对象本身
print('学号 is %s,姓名 is %s,年级 is %s,电话 is %s'%(self.id,self.name,self.grade,self.__phone)) def get_score(self):
return self.__score def set_score(self,sc):
self.__score = sc @classmethod #类方法
def change_schoolname(cls,schoolname):
cls.school = schoolname
cls.__changetime() #私有方法,内部可调用
print('学校名修改成功:%s,修改时间:%s'%(cls.school,cls.__lastchangetime)) @classmethod
def __changetime(cls):
cls.__lastchangetime = datetime.datetime.now() #私有变量内部可调用 @staticmethod #静态方法
def print_schoolname():
print('学校:',student.school,student.__lastchangetime) def __str__(self): #__xx__()方法为内部的特殊方法 __str__表示可用str()函数
return self.name+self.school
'''实例化对象,调用对象方法'''
xiaoming = student('小明','小班','',13500000000)
xiaohua = student('小花','小班','') xiaoming.print_info()
xiaohua.print_info() print(xiaoming.name)
#print(xiaoming.__phone) #调用对象的私有变量,报错 'student' object has no attribute '__phone' xiaoming.set_score(100)
print(xiaoming.get_score())
'''单个对象改变类变量'''
print('对象调用类变量:',xiaoming.school)
print('类调用类变量:',student.school) xiaoming.school = '大树小学' #仅改变自己的那一份拷贝,不影响其他对象
print('小明修改了xiaoming.school,小明的学校:',xiaoming.school) #大树小学
print('小明修改了xiaoming.school,小花的学校不变:',xiaohua.school) #不变
print('小明修改了xiaoming.school,student类的school:',student.school) #不变
'''调用类方法改变类变量'''
student.change_schoolname('大树幼儿园东部校区')
print('修改了student.school:类对象',student.school) #变了
print('修改了student.school:小明的学校 ',xiaoming.school) #还是大树小学
print('修改了student.school:小花的学校',xiaohua.school) #变了 xiaoming.change_schoolname('我的母校')
print('小明通过类方法修改了学校名 类对象:',student.school) #变了
print('小明通过类方法修改了学校名 小明的学校:',xiaoming.school) #还是大树小学
print('小明通过类方法修改了学校名 小花的学校:',xiaohua.school) #变了
'''调用私有变量报错'''
#print('对象调用类变量:',xiaoming.__lastchangetime) # 'student' object has no attribute '__address'
#print('类调用类变量:',student.__lastchangetime)# 'student' object has no attribute '__address'
'''python私有变量机制:变量名重整 _classname__私有变量名'''
print(student._student__lastchangetime)
'''调用私有方法报错'''
#student.__changetime()
#xiaoming.__changetime()
#student._student__changetime() #私有方法机制:方法名重整
'''静态方法'''
student.print_schoolname()
xiaoming.print_schoolname()
'''定义了__str__()方法后可用str()'''
print(str(xiaoming))

封装:属性私有化,提供对外访问的方法

利用列表实现类似栈的结构,栈不能直接访问
初始化函数传入栈的极限大小,封装获取是否为空及是否到达极限大小的私有方法。
对外提供弹栈和压栈,获取极限大小的方法
'''利用列表实现类似栈的结构
初始化函数传入栈的极限大小,栈不能直接访问
封装获取是否为空及是否到达极限大小的私有方法
对外提供弹栈和压栈,获取极限大小的方法'''
class stack: def __init__(self,maxlength): #构造函数
if type(maxlength) == type(1) and maxlength > 0: #正整数
self.__maxlength = maxlength
self.__stack = []
else:
raise ValueError('栈大小必须是正整数') def __ismaxlength(self): #是否到达极限长度
if len(self.__stack) == self.__maxlength:
return True
return False def __isNone(self): #是否为空
if len(self.__stack) == 0:
return True
return False def getmaxlength(self): #获取极限大小
return self.__maxlength def pop(self): #弹栈
if not self.__isNone(): #非空弹出最后一个
return self.__stack.pop()
raise IndexError('pop from empty stack') #空,报错 def push(self,data): #压栈
if not self.__ismaxlength(): #未到极限大小追加
self.__stack.append(data)
else:
raise OverflowError('stack is full,insert fail') #达到极限大小报错 def __len__(self): #可使用len()获取栈大小
return len(self.__stack)
 

测试一下:

if __name__ == '__main__':
#栈实例化
newstack = stack(10)
print('栈的极限大小:%s' % newstack.getmaxlength())
newstack.push('a')
newstack.push('b')
newstack.push('c')
newstack.push('d')
newstack.push('e')
newstack.push('f')
print('栈实际大小:%s' % len(newstack))
print(newstack.pop())
print(newstack.pop())
print(newstack.pop())
print('栈的极限大小:%s' % newstack.getmaxlength())
print('栈实际大小:%s' % len(newstack))
    print(newstack.pop())
print(newstack.pop())
print(newstack.pop())
print(newstack.pop()) #报错 IndexError: pop from empty stack
    newstack = stack(1)
print('栈的极限大小:%s' % newstack.getmaxlength())
newstack.push('a')
newstack.push('b') #报错 OverflowError: stack is full,insert fail

the end

python入门17 类和对象的更多相关文章

  1. Python 入门 之 类成员

    Python 入门 之 类成员 1.类的私有成员: 私有: 只能自己拥有 以 __ 开头就是私有内容 对于每一个类的成员而言都有两种形式: - 公有成员,在任何地方都能访问 - 私有成员,只有在类的内 ...

  2. Python 入门 之 类的约束以及super()剖析

    Python 入门 之 类的约束以及super()剖析 1.类的约束 第一版: class WechatPay: def pay(self): print("微信支付") clas ...

  3. Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系)

    Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系) 在面向对象的中,类与类之间存在三种关系:依赖关系.组合关系.继承关系. 1.依赖关系:将一个类的类名或对象当做参数传递给另一个函数被 ...

  4. Python之面向对象类和对象

    Python之面向对象类和对象 定义一个类:class 定义类的语法: class Test(object): """ 类里定义一类事物共同的技能. 可以是变量,也可是函 ...

  5. Python 面向对象(创建类和对象,面向对象的三大特性是指:封装、继承和多态,多态性)

    概念:                                                                                                 ...

  6. 初识python中的类与对象

    这篇博客的路线是由深入浅,所以尽管图画的花花绿绿的很好看,但是请先关注我的文字,因为初接触类的小伙伴直接看类的实现可能会觉得难度大,只要耐着性子看下去,就会有一种“拨开迷雾看未来”的感觉了. 一.py ...

  7. python中的类,对象,方法,属性等介绍

    注:这篇文章写得很好.加底纹的是我自己的理解 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...

  8. Python里的类和对象简介

    ---恢复内容开始--- Python里的类  对象=属性+方法: 对象的属性主要是指主要的特征和参量,而方法主要是指函数: 类是一个具有一定特征和方法的集合,而对象是类的一个:类和对象的关系就如同模 ...

  9. Python进阶-XV 类和对象的命名空间 组合

    一.类和对象命名空间 1.类中可以定义两种属性 静态属性和动态属性 class Course: language = 'Chinese' # 静态属性 def __init__(self, name, ...

随机推荐

  1. GraphQL 暂停

    别人的文章 http://blog.csdn.net/imwebteam/article/details/53888708 Java 文档都打不开,已经在GitHub上提了 in README.md ...

  2. java File delete()执行失败原因(转)

    java.io.File里的delete操作很实用也很常用,可以用来删除单独的文件和某一目录.但有时候会出现delete失败的情况,出现这种情况的原因一般有以下几种:1.删除时还有其他程序在使用该文件 ...

  3. UWP 应用获取各类系统、用户信息 (2) - 商店授权信息、零售演示模式信息、广告 ID、EAS 设备信息、硬件识别信息、移动网络信息

    应用开发中,开发者时常需要获取一些系统.用户信息用于数据统计遥测.问题反馈.用户识别等功能.本文旨在介绍在 Windows UWP 应用中获取一些常用系统.用户信息的方法.示例项目代码可参见 Gith ...

  4. package.json中dependencies 和devDependencies的差异

    我们在日常开发中,经常会使用到npm安装对应的包,会经常在package.json中看到dependencies 和devDependencies 二者的区别: devDependencies:是你开 ...

  5. ASP.NET生命周期详解(转)

    看到好文章需要分享. 最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多 ...

  6. log4net写入DB2备忘 via OLEDB & ODBC

    在项目中遇到需要记录操作日志的需求,由于是一个外挂系统,因此不用考虑到公司框架的限制,直接二层架构直连数据库,考虑使用log4net连接DB2.请宽恕我这个非软工科班出身的IT小白,以前一直在知道有个 ...

  7. 快速排序——Java实现

    一.排序思想 快速排序是由冒泡排序改进而得到的,是一种分区交换排序方法.思想如下:一趟快速排序采用从两头向中间扫描的方法,同时交换与基准记录逆序的记录. 在待排序的N个记录中任取一个元素(通常取第一个 ...

  8. hdu 1520 树形DP基础

    http://acm.hdu.edu.cn/showproblem.php?pid=1520 父节点和子节点不能同时选. http://blog.csdn.net/woshi250hua/articl ...

  9. 弹出框layer插件

    有时候我们在网页制作中需要引用各种弹出框,弹出框的展现形式多种多样.可以是弹出图片,视频,文字,也可以是弹出图片轮播等形式: 弹出框插件——layer使用方法(其实官方文档中已经介绍的很详细): 下载 ...

  10. CSS中关于linebox的baseline位置移动的理解

    前言 最近看到一篇文章,弗里得木的翻译笔记,里面有个问题没有解决,就是linebox的baseline为什么会移动呢? 在讨论这个问题之前读者需要对 默认值baseline 以及 其他属性值(天镶的博 ...