Python进阶8---面向对象基础1
面向对象
语言的分类
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的更多相关文章
- Python进阶(十三)----面向对象
Python进阶(十三)----面向对象 一丶面向过程编程vs函数式编程vs面向对象编程 面向过程: 简而言之,step by step 一步一步完成功能,就是分析出解决问题所需要的步骤,然后用函 ...
- 8.python笔记之面向对象基础
title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...
- python进阶08 MySQL基础补充
python进阶08 MySQL基础补充 本次课程都是基于三张表格的使用 一.子查询 #如何找到‘张三’的成绩 #思路:先找到张三的学号,在拿这个张三的学号到成绩表里面去匹配,得出成绩 #如何用一条查 ...
- python进阶01 面向对象、类、实例、属性封装、实例方法
python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...
- Python进阶----数据库的基础,关系型数据库与非关系型数据库(No SQL:not only sql),mysql数据库语言基础(增删改查,权限设定)
day37 一丶Python进阶----数据库的基础,mysql数据库语言基础(增删改查,权限设定) 什么是数据库: 简称:DataBase ---->DB 数据库即存放数据的仓库, ...
- Python进阶之面向对象编程
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...
- python之路 面向对象基础 XML
一.面向对象基础 1.类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义 ...
- Python学习之面向对象基础
python的面向对象和以前学的c++,Java都是一般,大同小异,面向对象基础先谈谈类的构造,编写,属性和方法的可见性等等 1.定义类,创建和使用对象 #定义类 class Student(obje ...
- Python进阶之面向对象编程(二)
Python面向对象编程(二) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...
- Python进阶之面向对象编程概述
Python面向对象编程(一) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...
随机推荐
- Python Ast介绍及应用
Abstract Syntax Trees即抽象语法树.Ast是python源码到字节码的一种中间产物,借助ast模块可以从语法树的角度分析源码结构.此外,我们不仅可以修改和执行语法树,还可以将Sou ...
- 关于获取资源文件,Class.getResource和ClassLoader.getResource的区别
原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2019-02-22/29.html 作者:夜月归途 出处:http://www.guitu ...
- GoLang simple-project-demo-02
GoLang 有很多种数据类型:字符型,整型,浮点型,布尔型.下面是基础例子: package main import "fmt" func main() { fmt.Printl ...
- [orleans2.1]这是你没玩过的船新版本
不知不觉orleans就发布到2.1版本的,但是说也奇怪orleans越是完善我发现园子相关的博客就越少,大概是大佬都在美滋滋用在生产环境,不屑于玩demo了吧. 但是小弟不才还是只会玩demo,所以 ...
- 初学pyhon的几个练习小程序
一.概述 此程序示例为博主根据路飞学城的python的作业而写的(博主也是python初学者,仅花了99元报了路飞学城的python入门14天集中营3期网络课堂班),此程序非常适合python初学者拿 ...
- PostGIS计算矢量切片(二)--按值渲染
方案背景 今年三月份写了一篇postgis计算矢量切片,参考了网上资料给出了一份很粗糙的相关方案(文章写的更粗糙).当时的方案中只能针对gis形状进行渲染,而不能用属性渲染.针对这个情况,本文 ...
- Odoo的模块和应用程序的区别和使用
一.模块(modules)和应用程序(application)的区别: 模块元件是Odoo应用程序的组成快.模块可以将新功能添加到Odoo,或改变现有功能.模块是一个包含名为__manifest__. ...
- solr8.0 ik中文分词器的简单配置(二)
下载ik分词器,由于是solr8.0,一些ik分词器版本可能不兼容,以下是个人亲测可行的版本 ik分词器下载 然后将解压出来的两个jar包放到以下路径: 其它的三个文件放到以下路径: 如果没有clas ...
- Openlayers系列(一)关于地图投影相关错误的解决方案
背景 近期开发以MongoDB为基础的分布式地理数据管理平台系统,被要求做一个简单的demo给客户进行演示.于是笔者便打算向数据库中存储一部分瓦片数据,写一个简单的存取服务器,使用Openlayers ...
- Android远程桌面助手(B1185)for Android P开发者预览版
Android P的开发者预览版已出,其中App compatibility changes部分特别强调“The platform restricts the use of some non-SDK ...