面向对象

语言的分类

Python的类

定义

class ClassName:
pass

class MyCalss:
"""A example class"""#文档字符串
x = 'abc'#类属性 def foo(self):#类属性foo,也是方法
return 'myclass'

类对象及类属性

实例化

a = MyClass()   #实例化

__init__方法

class MyCalss:

    def __init__(self):#初始化
print('init') a = MyCalss()

实例对象

self

class Person:
def __init__(self):
print(id(self)) c = Person() #会调用__init__
print('p={}'.format(id(c)))
#输出结果:
43079160
c=43079160

实例变量和类变量

class Person:
age = 7
height = 175
def __init__(self,name,age=23):
self.name = name
self.age = age tom = Person('tom')
jerry = Person('jerry',20) Person.age = 30
print(Person.age,tom.age,jerry.age)
print(Person.__dict__,tom.__dict__,jerry.__dict__,sep='\n') Person.height += 5
print(Person.__dict__,tom.__dict__,jerry.__dict__,sep='\n') tom.height = 176
print(Person.__dict__,tom.__dict__,jerry.__dict__,sep='\n') Person.weight = 65
print(Person.__dict__['weight'])
print(tom.__dict__['weight'])#KeyError

装饰一个类

#增加类变量
def add_name(name,cls):
cls.NAME = name #动态增加类属性 #改进成装饰器(带参)
def add_name1(name):
def wrapper(cls):
cls.NAME = name
return cls
return wrapper @add_name1('tom')
class Person:
AGE = 1 print(Person.NAME)

类方法和静态方法

普通函数

类方法

  

静态方法

方法的调用

class Person:
def normal_method():
print('nomal') def method(self):
print("{}'s method ".format(self)) @classmethod
def class_method(cls):
print('class = {0.__name__} {0}'.format(cls))
cls.HEIGHT =175 @staticmethod
def static_method():
print(Person.HEIGHT) #~~~类访问~~~
print(1,Person.normal_method())
# print(2,Person.method())#报错
print(3,Person.class_method())
print(4,Person.static_method())
#~~~实例访问~~~
tom = Person()
# print(5,tom.normal_method())#报错
print(6,tom.method())
print(7,tom.class_method())
print(8,tom.static_method())

访问控制

私有属性Private

一般来说,可以在内部自定义一个方法来访问私有变量。

私有变量的本质

保护变量

 私有方法

私有方法的本质

私有成员的总结

补丁

#test1.py
from test2 import Person
from test3 import get_score def monkeypatch4Person():
Person.get_score = get_score print(Person().get_score())
monkeypatch4Person() print(Person().get_score()) #输出如下:
{'English': 78, 'Chinese': 86, 'History': 82} #打补丁前
{'name': 'Person', 'English': 88, 'Chinese': 90, 'History': 85} #打补丁后
#test2.py
class Person:
def get_score(self):
ret = {'English':78,'Chinese':86,'History':82}
return ret
#test3.py
def get_score(self):
return dict(name=self.__class__.__name__,English=88,Chinese=90,History=85)

属性装饰器

class Person:
def __init__(self,chinese,english,history):
self._chinese = chinese
self._eng = english
self.__his = history def gethis(self):
return self.__his def sethis(self,value):
self.__his = value def seteng(self,value):
self._eng = value @property
def chinese(self):
return self._chinese @chinese.setter
def chinese(self,value):
self._chinese = value @chinese.deleter
def chinese(self):
# del self._chinese
print('del self._chinese') #x = property(getx, setx, delx, "I'm the 'x' property.")
eng = property(lambda self:self._eng,seteng) student = Person(80,90,88)
print(student.chinese)#
student.chinese = 100
print(student.chinese)#
del student.chinese
print(student.eng)#
student.eng =110
print(student.eng)#

对象的销毁

方法重载(overload)

重写也就是覆盖的意思,即override。 

封装

练习

#1.其结构值得参考!
from random import randint
class RandomGenerator:
def __init__(self,count=10,start=1,stop=100):
self.count = count
self.start = start
self.stop = stop
self.gen = self._generatr() def _generatr(self):
while True:
yield [randint(self.start,self.stop) for _ in range(self.count)] def gengerate(self,count):
self.count = count
return next(self.gen) rg = RandomGenerator()
lst = rg.gengerate(10)
print(lst)
#
class Point:
def __init__(self,x,y):
self.x = x
self.y = y def __repr__(self):
return '{}:{}'.format(self.x,self.y)
lst1 = [Point(*v) for v in zip(rg.gengerate(10),rg.gengerate(10))]
print(lst1)
#输出如下:
[36:14, 84:20, 31:84, 68:82, 36:48, 87:67, 64:49, 8:15, 55:73, 90:75]
#
class Car:
def __init__(self,mark=None,color=None,price=None,speed=None):
self._mark = mark
self._color = color
self._price = price
self._speed = speed class CarInfo:
def __init__(self):
self.lst = [] def addcar(self,car:Car):
self.lst.append(car) def showcarinfo(self):
return self.lst
#
class Temperature:
def __init__(self,t,unit='c'):
self._c = None
self._f = None
self._k = None
if unit == 'k':
self._c = self.k2c(t)
self._k = t
elif unit == 'f':
self._c = self.f2c(t)
self._f = t
else:
self._c = t @property
def k(self):
if self._k is None:
self._k = self.c2k(self._c)
return self._k @property
def f(self):
if self._f is None:
self._f = self.c2f(self._c)
return self._f @property
def c(self):
return self._c @classmethod
def c2f(cls,c):
return c*9/5+32 @classmethod
def f2c(cls,f):
return (f-32)*5/9 @classmethod
def c2k(cls,c):
return c+273.15 @classmethod
def k2c(cls,k):
return k-273.15 @classmethod
def f2k(cls,f):
return cls.c2k(cls.f2c(f)) @classmethod
def k2f(cls,k):
return cls.c2f(cls.k2c(k)) print(Temperature.c2f(40))
print(Temperature.c2k(40))
print(Temperature.f2c(104.0))
print(Temperature.f2k(104.0))
print(Temperature.k2c(313.5))
print(Temperature.k2f(313.5)) t = Temperature(40)
print(t.c,t.f,t.k) t = Temperature(313.5,'k')
print(t.c,t.f,t.k)
#简单购物车
class Color:
RED = 0
BLUE = 1
GREEN = 2
BLACK = 3
GOLDEN = 4
OTHER = 100 class Item:
def __init__(self,**kwargs):
self.__info = kwargs def __repr__(self):
return str(sorted(self.__info.items())) class Cart:
def __init__(self):
self.items = [] def additem(self,item:Item):
self.items.append(item) def gatallitems(self):
return self.items mycart = Cart()
myphone = Item(mark='Iponhe',color=Color.GOLDEN,memory='64G')
mycart.additem(myphone)
mycar = Item(mark='BMW',color=Color.BLACK,memory='220/s')
mycart.additem(mycar)
print(mycart.gatallitems())

Python进阶8---面向对象基础1的更多相关文章

  1. Python进阶(十三)----面向对象

    Python进阶(十三)----面向对象 一丶面向过程编程vs函数式编程vs面向对象编程 面向过程: ​ 简而言之,step by step 一步一步完成功能,就是分析出解决问题所需要的步骤,然后用函 ...

  2. 8.python笔记之面向对象基础

    title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...

  3. python进阶08 MySQL基础补充

    python进阶08 MySQL基础补充 本次课程都是基于三张表格的使用 一.子查询 #如何找到‘张三’的成绩 #思路:先找到张三的学号,在拿这个张三的学号到成绩表里面去匹配,得出成绩 #如何用一条查 ...

  4. python进阶01 面向对象、类、实例、属性封装、实例方法

    python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...

  5. Python进阶----数据库的基础,关系型数据库与非关系型数据库(No SQL:not only sql),mysql数据库语言基础(增删改查,权限设定)

    day37 一丶Python进阶----数据库的基础,mysql数据库语言基础(增删改查,权限设定) 什么是数据库:    简称:DataBase ---->DB    数据库即存放数据的仓库, ...

  6. Python进阶之面向对象编程

    面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...

  7. python之路 面向对象基础 XML

    一.面向对象基础 1.类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义 ...

  8. Python学习之面向对象基础

    python的面向对象和以前学的c++,Java都是一般,大同小异,面向对象基础先谈谈类的构造,编写,属性和方法的可见性等等 1.定义类,创建和使用对象 #定义类 class Student(obje ...

  9. Python进阶之面向对象编程(二)

    Python面向对象编程(二) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...

  10. Python进阶之面向对象编程概述

    Python面向对象编程(一) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...

随机推荐

  1. AndroidManifest设置android:allowBackup="false"报错

    概述 设置android:allowBackup="false"的必要性 Android API Level 8及其以上Android系统提供了为应用程序数据的备份和恢复功能,此功 ...

  2. C# net request payload形式发送post请求

    因为开发微信群发电脑版需要模拟微信POST请求,微信发送消息使用request payload发送,实际发送的是json字符串.我们只需要生成的json字符串和请求的一致,header头完全模拟即可. ...

  3. SLAM+语音机器人DIY系列:(二)ROS入门——4.如何编写ROS的第一个程序hello_world

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  4. Django-restframework 之权限源码分析

    Django-restframework 之权限源码分析 一 前言 上篇博客分析了 restframework 框架的认证组件的执行了流程并自定义了认证类.这篇博客分析 restframework 的 ...

  5. C# 数组Array

    数组是对相同类型的一组数据的封装.数组定义的时候,要说明是对哪一种类型的封装,并且要指定长度. using System; using System.Collections.Generic; usin ...

  6. 【转载】Sqlserver数据库中无自增Id的情况下使用ROW_NUMBER()函数进行数据分页

    在Sqlserver数据库中,如果查询表中含有自增长Id列,一般会采用select Top的方式来数据的分页操作.而实际上很多数据表设计的时候,不一定含有自增长Id列,那么数据库没有Id自增列的时候要 ...

  7. DRDS分布式SQL引擎—执行计划介绍

    摘要: 本文着重介绍 DRDS 执行计划中各个操作符的含义,以便用户通过查询计划了解 SQL 执行流程,从而有针对性的调优 SQL. DRDS分布式SQL引擎 — 执行计划介绍 前言 数据库系统中,执 ...

  8. Deepin MongoDB安装&使用总结

    参考:手把手教你 MongoDB 的安装与详细使用(一) deepin 安装 mongodb 数据库(全面) 1. 导入公钥 sudo apt-key adv --keyserver hkp://ke ...

  9. (一) Keras 一元线性回归

    视频学习来源 https://www.bilibili.com/video/av40787141?from=search&seid=17003307842787199553 笔记 环境为 an ...

  10. 基于python开发的股市行情看板

    个人博客: https://mypython.me 近期股市又骚动起来,回忆起昔日炒股经历,历历在目,悲惨经历让人黯然神伤,去年共投入4000元入市,最后仅剩1000多,无奈闭关修炼,忘记股市,全身心 ...