面向对象的高级编程

1.给类对象绑定的函数,只对这个对象生效, 而对类绑定的对象, 所有的对象都可以调用. 栗子:

def set_score(self, score):
    self.score = score

s.set_age = MethodType(set_score, s)    #对象绑定

Student.set_score = MethodType(set_score, Student)    #绑定类

动态绑定允许我们在程序运行的过程中动态给class加上功能,这在静态语言中很难实现

2.使用__slots__ 限制实例属性. 在定义class的时候,定义一个特殊的__slots__变量, 限制该class实例能添加的属性

class Student(object):
    __slots__ = (‘name‘, ‘age‘) # 用tuple定义允许绑定的属性名称

要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的

3.使用@property可以将python定义的函数"当做"属性访问, 从而提供更加友好的访问方式, 但有时候setter/getter也是需要的.

内置装饰器负责把一个方法变成属性调用, 它既能检查参数,又可以用类似属性这样简单的方式来访问变量.

4.多重继承

class Animal(object):
    pass

# 大类:
class Mammal(Animal):
    pass

class Bird(Animal):
    pass

# 各种动物:
class Dog(Mammal):
    pass

class Bat(Mammal):
    pass

class Parrot(Bird):
    pass

class Ostrich(Bird):
    pass

IO编程

#!/usr/bin/env python
# encoding: utf-8
f = open(‘./testdir/test.txt‘, ‘r‘)  #‘r‘表示读

f.read()    #一次读取文件的全部内容

f.close()   #关闭文件

#文件读写出错都可能产生IOError,一旦出错,f.close就不能调用
#为保证无论是否出错都能正确关闭文件,我们用try...finally实现

try:
    f = open(‘./testdir/Forever.mp3‘, ‘rb‘)
    print(f.read())
finally:
    if f:
        f.close()

#每次这样写太繁琐,引入with语句自动帮我们调用方法:
with open(‘./testdir/test.txt‘, ‘r‘) as f:
    print(f.read())

# read(size)防止一次性读取文件过多,内存负荷,可以反复调用
# 调用readline()可以每次读取一行内容
# 调用readlines()一次读取所有的内容并按行返回list

#如果文件很小,read()一次性读取最方便;如果不能确定文件大小,
#反复调用read(size)比较保险;
#如果是配置文件,调用readlines()最方便

for line in f.readlines():
    print(line.strip)   #把末尾的‘\n‘删掉

##file-like Object不要求从特定类继承,只要写个read()方法就行
# StringIO就是在内存中创建的file-like Object,常用作临时缓冲

#读取二进制文件,如图片视频音频等,用‘rb‘
#要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数
#       栗子:读取GBK编码的文件
f = open(‘./testdir/Forever.mp3‘, ‘rb‘)
f.read()

f = open(‘./testdir/test.txt‘, ‘r‘, encoding = ‘gbk‘)
f.read()

#某些不规范文件,会遇到UnicodeDecodeError,因为在文本文件中可能
#夹杂了一些非编码的字符. 这是open()函数还接收一个errors参数,
#表示如果遇到编码错误后如何处理. 最简单处理是直接忽略
f = open(‘./testdir/Forever.mp3‘, ‘r‘, encoding = ‘gbk‘, errors = ‘ignore‘)

#写文件 ‘w‘文本文件, ‘wb‘二进制文件
f = open(‘./testdir/test.txt‘, ‘w‘)
f.write(‘gogleem‘)
f.close()

#保险的with语句,防止忘记写close
with open(‘./testdir/test.txt‘, ‘w‘) as f:
    f.write(‘Frente!‘)

#要写入特定编码的文本文件,请给open()函数传入encoding参数,
#        字符串自动转换成指定编码

#使用with语句操作文件IO是个好习惯
# w是覆盖, a是续写
时间: 2024-08-13 20:14:49

面向对象的高级编程的相关文章

Python 面向对象之高级编程

7.面向对象高级编程 7.1使用__slots__ python动态语言,new 对象后绑定属性和方法 Tip:给一个实例绑定的方法,对其他对象无效.可以通过对class绑定后,所有对象可以调用该方法 如果我们现在只有实例可以添加属性,使用__slots__,只允许对Student实例添加name和age属性, 添加其他属性报错 class Student(object): __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称 该限定只对当前对象起作用,

第十章第2讲:面向对象的高级编程:动态语言

1.体验python动态语言的魅力 # 定义一个空类,实例化后,给实例绑定属性与方法 class Person(object): pass s = Person() # 给实例s绑定属性 s.name = "Ann" print(s.name) def set_age(self,age): self.age = age from types import MethodType s.set_age = MethodType(set_age,s) s.set_age = 25 print(

Python3 面向对象 高级编程

正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.  class Student(object): pass 然后,尝试给实例绑定一个属性: >>> s = Student() >>> s.name = 'Michael' # 动态给实例绑定一个属性 还可以尝试给实例绑定一个方法: >>> def set_age(self, age): # 定义一个函数作为实例方法 ...

C++面向对象高级编程(九)Reference与重载operator new和operator delete

摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nullptr 2.引用之后不能再引用别人 3.引用通常不用于声明变量,多用于参数类型,和返回值类型 见下面代码 int main(int argc, const char * argv[]) { int x=0; //p is a pointer to x int* p = &x; // r is a

C++面向对象高级编程(七)point-like classes和function-like classes

技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 /*简单实现一下智能指针的*与 -> 操作符*/ template <class T> class shared_ptr_test { public: T& operator* () const //重载* { return *px; } T* operator->() co

C++面向对象高级编程(六)转换函数与non-explicit one argument ctor

技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任意写转换函数 class Fraction { public: Fraction(int num, int den = 1):m_numerator(num),m_denominator(den){} operator double() const //注意看 没有返回类型,这个编译器会帮做,且防止

C++面向对象高级编程(三)

版权声明:本文为博主原创文章,未经博主允许不得转载. 接下来的几篇文章,我将回忆一下C++的基础. C++的由两部分组成 1.C++语言 2.C++标准库 本篇文章主要分享我学习C++语言的笔记. 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主要围绕不带指针的class complex本节中主要围绕带指针的String类 前面我说过如果你创建的类不带有指针,那么多半你可以不用写析构函数,但是如果你创建了一个带指针的类,那么你必须重写Big Three 创建一个类

Python自动化开发课堂笔记【Day08】 - Python进阶(面向对象的高级用法,网络编程)

面向对象的高级用法 1. __str__ 只要执行打印对象的操作,就会触发该对象类中的__str__方法(也就是对象的绑定方法)它是一种默认的方法,默认的打印输出为<__main__.Foo object at 0x003EE350>,但是如果将该绑定方法在类中重写的话,要求必须有以字符串类型的返回值,返回形式可以自己设定. class Foo: def __init__(self,name,age): self.name = name self.age = age def __str__(s

C++面向对象高级编程(二)

版权声明:本文为博主原创文章,未经博主允许不得转载. 接下来的几篇文章,我将回忆一下C++的基础. C++的由两部分组成 1.C++语言 2.C++标准库 本篇文章主要分享我学习C++语言的笔记. 这次主要回忆一下操作符重载. 先看一段代码,后续我会介绍这么做的原由 #include <iostream> class complex { public: complex(double r = 0, double i = 0) : re(r) ,im(i) {} complex& oper