面向对象

语言的分类

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. python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍

    目录 python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍.md 一丶字典 1.字典的定义 2.字典的使用. 3.字典的常用方法. python学习第八讲,python ...

  2. js中let和var的区别 不懂得加QQ 2270312758

    js中使用let定义变量的时候,是需要使用严格模式的,我看到网上有的博客说:如果在不使用严格模式的情况下,使用let会报错,但是在实验的过程中,我直接定义了let变量而且也没有使用严格模式,并没有报任 ...

  3. C# 2进制、8进制、10进制、16进制...各种进制间的转换(三) 数值运算和位运算

    一.数值运算 各进制的数值计算很简单,把各进制数转换成 十进制数进行计算,然后再转换成原类型即可. 举例 :二进制之间的加法 /// <summary> /// 二进制之间的加法 /// ...

  4. Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式

    一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...

  5. 操作系统,时间片轮转算法的C语言实现Round Robin

    #include "windows.h" #include <conio.h> #include <stdlib.h> #include <fstre ...

  6. javascript排序算法-选择排序

    选择排序 概念:选择排序大致的思路是找到数据结构中的最小值并将其放置在第一位,接着找到第二小的值并将其放在第二位,以此类推. 复杂度: O(n^2) 代码实现 var swap = function ...

  7. 通用查询类封装之Mongodb篇

    查询在应用程序中很重要,花样也特别多,不同得业务需求需要不同的查询条件,还要支持and.or ……事实上也确实如此,程序中有N多个查询类,并且很可能其中有多个类查询同一张表,所以特别想弄一个通用的查询 ...

  8. Android Studio教程09-加载器Loader的使用

    目录 1.加载器特征 2. Loader API 3. 在应用中使用Loader 3.1. 启动加载器 3.2. 重启加载器 3.3. 使用LoaderManager回调 4. 实例: 访问用户联系人 ...

  9. 突破瓶颈,再出发 - PM过程能力成熟度5级

    尽管程度不同,但PM的每个级别都在践行过程改进,并在4级借助数据,达到了“登峰造极”的程度.随着量化与统计分析的深入,项目会被优化到极其稳定的状态,组织的过程改进也就此进入了平台期. 平台期可以被视为 ...

  10. 记MVC学习过程中一次传参到View时遇到的错误

    在跟着 <PRO ASP.NET MVC5>一书进行第七章的练习的时候遇到了以上问题, 当遇到此类问题的时候应该先检查方法传输和其视图接受的数据类型是否一致, 大多时候都是因为两者数据类型 ...