python learning OOP1.py
class Student(object):
# 构造函数
# 第一个参数永远是 self 表示一个实例本身,但是传参的时候不需要传
# 在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
def __init__(self, name, score):
self.__name = name
self.__score = score
# 可以用 self 来表示类似 this 指针的作用
def print_score(self):
print('%s: %s' % (self.__name, self.__score))
bart = Student('Bart', 59)
lisa = Student('Lisa', 89)
bart.print_score()
lisa.print_score()
# class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的
# 通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。
# 创建实例是通过类名+()实现的
# 可以自由地给一个实例变量绑定属性,比如,给实例bart绑定一个name属性:
bart.sno = 111500206
print(bart.sno)
# 继承与多态
class Animal(object):
def run(self):
print("Animal is running.")
class Dog(Animal):
def run(self):
print("Dog is running.")
class Cat(Animal):
def run(self):
print("Cat is running")
dog = Dog()
dog.run()
cat = Cat()
cat.run()
# 判断一个变量是否是某个类型可以用isinstance()判断:
a = [1,2,3]
print(isinstance(a, list))
print(isinstance(dog, Animal))
print(isinstance(dog, Dog))
print(isinstance(dog,Animal)) # 子类实例也是基类的实例
def run_twice(animal):
animal.run()
animal.run()
run_twice(Animal())
run_twice(Dog())
run_twice(Cat())
# 如果以后新增 Animal 的子类,则不需要对 run_twice 进行任何修改
# 这就是著名的“开闭”原则:对扩展开放:允许新增Animal子类;对修改封闭:不需要修改依赖Animal类型的run_twice()等函数。
class Tortoise(Animal):
def run(self):
print('Tortoise is running slowly...')
run_twice(Tortoise())
# Tip:
'''
对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。
对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了
这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。
'''
# 获得对象信息
# 判断对象类型,使用type()函数:
print(type(123))
print(type('str'))
print(type(abs))
print(type(a))
print(type(dog))
print(type(123) == type(456))
print(type(123) == int)
# 判断一个对象是否是函数
import types
def fn():
pass
print(type(fn) == types.FunctionType)
print(type(abs) == types.BuiltinFunctionType)
print(type(lambda x : x) == types.LambdaType)
print(type((x for x in range(10)))==types.GeneratorType)
# 对于class的继承关系来说 ,可以使用isinstance()函数判断class的类型
class Husky(Dog):
def run(self):
print("Husky is running")
a = Animal()
d = Dog()
h = Husky()
print('isinstance test')
print(isinstance(h, Husky))
print(isinstance(d, Dog) and isinstance(d, Animal))
print(isinstance(d, Husky))
# isinstance 也可以当 type 有类似用法
print(isinstance('a', str))
# 还可以判断一个变量是否是某些类型中的一种
print(isinstance([1,2,3],(list,tuple)))
print(isinstance((1,2),(list,tuple)))
# 如果要获得一个对象的所有属性和方法,可以使用dir()函数
print(dir('ABC'))
print(dir(h))
'''
类似__xxx__的属性和方法在Python中都是有特殊用途的,比如__len__方法返回长度。在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的__len__()方法,所以,下面的代码是等价的:
>>> len('ABC')
3
>>> 'ABC'.__len__()
3
其余的则是 普通属性或方法
'''
# 我们自己写的类,如果也想用len(myObj)的话,就自己写一个__len__()方法:
class pig(Animal):
def __len__(self):
return 100
p = pig()
print(len(p))
# 实例属性和类属性
# 由于Python是动态语言,根据类创建的实例可以任意绑定属性。
class Undergraduate(object):
name = 'Student'
s = Undergraduate()
print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
print(Undergraduate.name) # 类的 name 属性
s.name = "Michael"
print(s.name)
del s.name # # 如果删除实例的name属性
print(s.name) # 再次调用s.name,由于实例的name属性没有找到,类的name属性就显示出来了
# 练习:
# 为了统计学生人数,可以增加一个类属性,每创建一个实例,该属性自动增加:
class Undergraduate(object):
count = 0
def __init__(self,name):
self.name = name
Undergraduate.count += 1
if Undergraduate.count != 0:
print('测试失败!')
else:
bart = Undergraduate('Bart')
if Undergraduate.count != 1:
print('测试失败!')
else:
lisa = Undergraduate('Bart')
if Undergraduate.count != 2:
print('测试失败!')
else:
print('Undergraduates:', Undergraduate.count)
print('测试通过!')
python learning OOP1.py的更多相关文章
- python learning IO.py
f = open('test.txt', 'r') # 'r' 表示只读 s = f.read() # 调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示 ...
- python learning OOP2.py
class Student(object): pass s = Student() s.name = 'Chang' # 给一个实例动态绑定一个属性 print(s.name) def set_age ...
- python learning Exception & Debug.py
''' 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返 ...
- Python Learning
这是自己之前整理的学习Python的资料,分享出来,希望能给别人一点帮助. Learning Plan Python是什么?- 对Python有基本的认识 版本区别 下载 安装 IDE 文件构造 Py ...
- python下编译py成pyc和pyo
python下编译py成pyc和pyo 其实很简单, 用 python -m py_compile file.py python -m py_compile /root/src/{file1,f ...
- python 装 ez_setup.py 出错
python 装 ez_setup.py出错setuptools,pip,install,UnicodeDecodeError: 'ascii' codec can't decode byte.解决: ...
- python中__init__.py文件的作用
问题 在执行models.py时,报ImportError:No module named transwarp.db的错误,但明明transwarp下就有db.py文件,路径也没有错误.真是想不通.后 ...
- Python的__init__.py用法
python中包的引入,对于大型项目中都会使用到这个功能,把实现不同功能的python文件放在一起,组成不同lib库,然后在其他地方调用. 包,python源文件+__init__.py 模块,pyt ...
- python d:\test.py File "<stdin>", line 1 python d:\test.py ^ SyntaxError: invalid syntax
pyhton出错: python d:\test.py File "<stdin>", line 1 python d:\test.py ^SyntaxError: i ...
随机推荐
- MapReduce详解及shuffle阶段
hadoop1.x和hadoop2.x的区别: Hadoop1.x版本: 内核主要由Hdfs和Mapreduce两个系统组成,其中Mapreduce是一个离线分布式计算框架,由一个JobTracker ...
- adb devices报错解决
1. 执行adb device报错如下 2. 报错原因及解决办法 报错时开启了Androidkiller,关闭即解决问题 可能原因:adb命令被占用冲突了
- Verdi调用VCS进行交互式仿真
前一篇介绍了使用Verdi的后处理模式查看仿真波形进行调试,此外Verdi还支持交互模式,可以调用外部仿真器,下面介绍Verdi调用VCS进行交互模式仿真的方法.注意,这里介绍的方法需要2016版的V ...
- matlab 基于 libsvm工具箱的svm分类遇到的问题与解决
最近在做基于无线感知的身份识别这个工作,在后期数据处理阶段,需要使用二分类的方法进行训练模型.本身使用matlab做,所以看了一下网上很多都是使用libsvm这个工具箱,就去下载了,既然用到了想着就把 ...
- jquery 获取checkbox的checked属性总是undefined
项目中用的jquery1.9 今天需要检测一个checkbox的选中状态,想当然的用 .attr("checked") ,结果发现,无论是否选中,这个值都是 undefined 未 ...
- 20155217 《信息安全系统设计基础》week16课堂测试
20155217 <信息安全系统设计基础>week16课堂测试 在作业本上完成附图作业,要认真看题目要求并提交作业截图. 在set的过程中,我们需要将hour部分进行赋值,赋值我们采用&q ...
- 一维码ITF 25简介及其解码实现(zxing-cpp)
一维码ITF 25又称交插25条码,常用在序号,外箱编号等应用.交插25码是一种条和空都表示信息的条码,交插25码有两种单元宽度,每一个条码字符由五个单元组成,其中二个宽单元,三个窄单元.在一个交插2 ...
- 2 CRM 讲师与学生,highcharts应用
一.讲师与学生简介 1 初始化 course_record,studyrecord, 2 考勤 3 录入成绩 4 显示成绩 ajax 查询 5 上传作业(os模块) 6 下载作业 二. 初始化 ,st ...
- 使用 Django WebSocket Redis 搭建在线即时通讯工具
话不多说先上效果图演示 项目:http://112.74.164.107:9990/ 1.安装组建 redis: yum install redis/apt install redis 2.创建虚拟化 ...
- UWP 滚动条私人定制
最近突然发现微软自带的滚动条好挫哦 微软哒(棒棒哒) 网上找的(美美哒) 好了. 如果你想要棒棒哒,那么就不用往下看了(手动再见). 如果你想要美美哒,就需要下面的神秘代码. <Style Ta ...