最近在看python数据结构的书,第二章是复习python面向对象编程,其中提到了python面向对象编程的特点(封装成模块,我的理解就是把跟某一个功能相关的操作都封装成一个类,对外部需要使用该功能的人来说,只需要调用提供的接口 其实就是调用这个类,不用关心内部具体是如何实现的)
之前对面向对象编程学的就不是很好,现在重新看,发现也没有那么难了,,,哈哈哈
先来看一个例子:(关于定义有理数类,包括有理数的定义,这里是用两个整数分别表示分子和分母,然后又定义了有理数相关的操作,包括加减乘除等)
另外 对于python中:python语言为所有的运算符(当然也包括算术运算符)都规定了特殊方法名!!!
我的理解就是当你在类中定义相关内部函数比如: –add–(双下划綫) 其实就是对应了算术运算符的+操作符~~
# -*- coding: utf-8 -*-
"""
Created on Mon Jul 30 09:43:41 2018
@author: xuanxuan
"""
class Rational:
@staticmethod
def _gcd(m,n):
if n==0:
m,n=n,m
while m!=0:
m,n=n%m,m
return n
def __init__(self,num,den):
if not isinstance(num,int) or not isinstance(den,int):
raise TypeError
if den==0:
raise ZeroDivisionError
sign=1
if num<0:
num,sign=-num,-sign
if den <0:
den,sign=-den,-sign
g=Rational._gcd(num,den)
self._num=sign*(num//g)
self._den=den//g
def num(self):
return self._num
def den(self):
return self._den
def __add__(self,another):
num=self._num*another.den()+self._den*another.num()
den=self._den*another.den()
return Rational(num,den)
def __mul__(self,another):
return Rational(self._num*another.num(),self._den*another.den())
def __floordiv__(self,another):
if another.num()==0:
raise ZeroDivisionError
return Rational(self._num*another.den(),self._den*another.num())
def __eq__(self,another):
return self._num*another.den()==self._den*another.num()
def __lt__(self,another):
return self._num*another.den()def __str__(self):
return str(self._num)+'/'+str(self._den)
def print(self):
print(self._num,'/',self._den)
if __name__=="__main__":
x=Rational(2,4)
print("the final result is",Rational(4,5)+x)
1.@staticmethod 是在非实例方法之前定义,区别于类中定义的其他实例方法,该非实例方法又称为静态方法,主要是作为一个局部函数来使用,为类中其他的实例方法打辅助的,哈哈哈哈‘
2.其实可以发现类中有两种类型的变量,self.num和num 前者是在整个类中使用的,作为某一个实例对象的变量在类中使用,而num变量其实就是类似于中间变量,为类中其他函数或变量服务的,,,他们之间的区别就好像实例方法和静态方法的区别,不知道理解的对不对~~~