一、__slots__和property

  1.__slots__魔术函数动态的添加方法和属性

  2.直接暴露属性的局限性

  3.使用get/set方法

  4.利用@property简化get/set方法

  5.利用@property实现只读属性

  6.装饰器与property实现

 # import traceback
# from types import MethodType
#
# class MyClass(object):
# # pass
# #在做新的类的时候,限制动态添加的属性,这个时候需要用到__slots__魔术变量,系统内为了实现某些特定功能的
# __slots__ = ['name','set_name'] # 这个地方,能添加的属性和方法就会受到限制,只能添加name或者set_name这两个名词的属性或者方法
# def set_name(self,name):
# self.name = name
# cls = MyClass() #实例化类
# cls.name='Tom' #动态的添加属性
# cls.set_name=MethodType(set_name,cls) #动态的添加方法 将set_name作用于cls上面
# cls.set_name('Jerry')
# print(cls.name)
# try:
# cls.age= #动态添加属性 ,这个地方要注意,age不在__slots__规定的数组中,所以会报错
# except AttributeError:
# traceback.print_exc() #打印出异常信息 AttributeError: 'MyClass' object has no attribute 'age'
#
# class ExtMyClass(MyClass): #继承自MyClass
# pass
# ext_cls = ExtMyClass()
# ext_cls.age=
# print(ext_cls.age)

  2.property

import traceback
class Student:
@property # 这个地方用装饰器进行修饰的时候,实际上是生成了一个新的对象,名字叫做score,这个相当于set函数
def score(self):
return self._score
@score.setter
def score(self,value):
if not isinstance(value,int): #进行value的类型检查,如果不是int型的值,就会报错not int
raise ValueError('not int') elif (value<) or (value>): #如果value只不是在这个区间之间的话,就会报错值不在0~100之间,这个地方相当于get函数
raise ValueError('not between 0 ~ 100')
self._score=value @property #注意,这里没有set方法,所以只能读取,不能写
def double_score(self):
return self._score*
s= Student()
s.score=
print(s.score)
print(s.double_score)
try:
s.double_score=
except AttributeError:
traceback.print_exc() try:
s.score='abc'
except ValueError:
traceback.print_exc()
try:
s.score=
except ValueError:
traceback.print_exc()

  3.枚举类

from enum import Enum

Month = Enum('Month',('Jan','Feb','Mar','Apr'))

for name,member in Month.__members__.items():
print(name,'=>',member,',',member.value) jan = Month.Jan
print(jan)

二、元类

  1.运行时动态创建 vs 编译时定义

def init(self,name):  #自定义构造函数,
self.name=name
def say_hello(self): #自定义成员函数
print('hello, %s!' %self.name) Hello = type('Hello',(object, ),dict(__init__ = init,hello=say_hello)) #(object, )是一个基类的列表 """
这个地方的代码等价于下面的这些代码:
class Hello:
def __init__(.......)
def hello(..........)
"""
h = Hello('Tom')
h.hello()

  2.使用type创建新类型

  3.metaclass(元类)

    (1)metaclass -> class -> instance

    (2)继承和动态绑定可以解决问题吗?

    (3)__new__函数

class ListMetaclass(type):
def __new__(cls,name,bases,attrs):
# print(cls) #打印出传进来的类时什么
# print(name) #打印出传进来的name是什么
# print(bases) #打印出传入进来的基类是什么 基类是list类
attrs['add'] = lambda self,value:self.append(value)
return type.__new__(cls,name,bases,attrs)
class MyList(list,metaclass=ListMetaclass): #从list类继承下来,就是一个数组,但是额外的增加add方法,实际等价于append
pass
mli = MyList()
mli.add()
mli.add()
mli.add()
print(mli)

三、ORM框架实例(重点的重点)

python学习笔记(12):高级面向对象的更多相关文章

  1. python 学习笔记 12 -- 写一个脚本获取城市天气信息

    近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...

  2. python学习笔记12 ----线程、进程

    进程和线程的概念 进程和线程是操作系统中两个很重要的概念,对于一般的程序,可能有若干个进程,每一个进程有若干个同时执行的线程.进程是资源管理的最小单位,线程是程序执行的最小单位(线程可共享同一进程里的 ...

  3. python学习笔记六 初识面向对象上(基础篇)

    python面向对象   面向对象编程(Object-Oriented Programming )介绍   对于编程语言的初学者来讲,OOP不是一个很容易理解的编程方式,虽然大家都知道OOP的三大特性 ...

  4. python学习笔记15(面向对象编程)

    虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程. 一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界 ...

  5. python 学习笔记9(面向对象)

    面向过程.函数式.面向对象 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象(Object Oriented Programmin ...

  6. python 学习笔记12(事件驱动、IO多路复用、异步IO)

    阻塞IO和非阻塞IO.同步IO和异步IO的区别 讨论背景:Linux环境下的network IO. 1.先决条件(几个重要概念) 1.1.用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32 ...

  7. Python学习笔记4 高级特性_20170618

    # 切片(获取list / tuple / 字符串 中指定的元素) l = list(range(10)) l[0:3] l[:3] # 0可以省略 l[:] # 全部 l[3:] # 最后的可以省略 ...

  8. 吴裕雄--天生自然python学习笔记:Python3 面向对象

    Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的. 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集 ...

  9. Python学习笔记12—类

    典型的类和调用方法: #!/usr/bin/env Python # coding=utf-8 __metaclass__ = type #新式类 class Person: #创建类 def __i ...

随机推荐

  1. linux运维、架构之路-禅道环境搭建

    一.介绍            禅道项目管理软件是国产的开源项目管理软件,专注研发项目管理,内置需求管理.任务管理.bug管理.缺陷管理.用例管理.计划发布等功能,实现了软件的完整生命周期管理. 禅道 ...

  2. [luogu]P3938 斐波那契[数学]

    [luogu]P3938 斐波那契 题目描述 小 C 养了一些很可爱的兔子. 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚 ...

  3. 设计模式学习笔记——Bridge 桥接模式

    先说一下我以前对桥接模式的理解:当每个类中都使用到了同样的属性或方法时,应该将他们单独抽象出来,变成这些类的属性和方法(避免重复造轮子),当时的感觉是和三层模型中的model有点单相似,也就是让mod ...

  4. iOS9 3DTouch 之 Home Screen Quick Actions

    最后更新:2016-12-18 测试环境: Xcode8.1 一.前言 iOS9 已经过去一年了,3D Touch也在项目中实战过,但一直没有总结一下,现在新的项目也用到了3D Touch, 网上找了 ...

  5. hashcode native

    hashcode Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值. 在设计hashCode方法和equal ...

  6. rf-idf的java实现

    还存在的问题是,对于其中分词借助的库还存在问题 参考此篇链接 http://www.cnblogs.com/ywl925/archive/2013/08/26/3275878.html 具体代码部分: ...

  7. cefsharp 在高DPI下闪烁的问题

    今天有客户朋友说程序在他的surface下界面很闪烁,搜索了相关的资料,初步判定是DPI引起的问题,但也有可能是cefsharp 51版本在WIN10上面没有禁用GPU加速,苦于没有环境测试,所以抱着 ...

  8. MySQL5.6transportable tablespace

    https://blog.csdn.net/xiaoyi23000/article/details/53150776

  9. 搜狗词库转txt

    #环境需求 Python2 1 #!/bin/python # -*- coding: utf- -*- import struct import sys import binascii import ...

  10. Celery多任务结构

    视图结构 pro_cel ├── celery_task# celery相关文件夹 │ ├── celery.py # celery连接和配置相关文件,必须叫这个名字 │ └── tasks1.py ...