面向对象

语言的分类

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. AntZipUtils【基于Ant的Zip压缩解压缩工具类】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 Android 压缩解压zip文件一般分为两种方式: 基于JDK的Zip压缩工具类 该版本存在问题:压缩时如果目录或文件名含有中文, ...

  2. 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  3. SLAM+语音机器人DIY系列:(三)感知与大脑——3.轮式里程计与运动控制

    摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...

  4. 盘点 Python 中的那些冷知识(一)

    小明在日常Code中遇到一些好玩,冷门的事情,通常都会记录下来. 现在已经积攒了一些了,最近打算整理一波,发出来给大家补补.一篇只分享五个,有时间了就整理.不想错过的,千万记得关注一下. 1. 省略号 ...

  5. Arrays工具、二维数组以及LeetCode练习题

    1 Arrays PS:Arrays位于java.util包下 int binarySearch(type[] a, type key); 使用二分法查询 key 元素在 a 数组中的索引,如果数组不 ...

  6. Ext.isIterable

    Ext.isIterable用于判断传入的参数是否为可迭代的 在这4种情况下,函数返回true 1:数组2:函数参数arguments3:HTML collections : NodeList4:HT ...

  7. eclipse建立工作集管理项目

    废话不多说,直接上图 然后新建java working set管理项目,让自己的项目清晰明了

  8. QT通过url下载图片到本地

    /* strUrl:下载图片时需要的url strFilePath:下载图片的位置(/home/XXX/YYY.png) */ void ThorPromote::downloadFileFromUr ...

  9. 30号快手笔试(三道ac两道半)————-历史上最大的网络失误orz

    case  50 ,20,100 做题以来第一次重大失误:最后两分钟发现手机关机了,然后充电开机orz 页面是js代码, 钟表是一直会走的, 手机没电了, 电脑连接的手机的热点: 只顾在调试,先过了第 ...

  10. 手把手教新手小白在window把自己的项目上传到github

    作为一个开发者,写博客,上传项目到github好像是不可不会的技能,很多有经验的老司机都会这么建议你.本宝宝第一次要把项目传到github的时候,确实有点蒙蔽,什么鬼,传个东西有必要这么难吗? git ...