1、面向对象编程
面向对象的特征就是:1、封装 2、继承 3、多态、
接着第七天的: 在我们的类中还有一个方法就是__str__(self): return ..... 这个函数是我们在控制台写print的时候默认会调用的这个函数,如果没有这个函数print()的时候,会默认使用的__repr__ 这个方法中的return值!
__repr__通常是在开发过程中。控制台循环打印的时候,想简略的看一下对象的时候使用这个!
__str__ 通常在是控制台上,给普通用户看的时候,使用的方法。
注意: 我们如果在使用类成员的时候,我们在规划类的时候,我们要把成员分清楚。就是这个成员是跟定义的类有关系,还是跟不同的实例的关系更密切!如果跟实例的关系更密切,要把它定义在实例中!前面要使用self 。 如果只是全局的关系更密切! 就是跟定义的类更密切,那样就拿出来!成为一个全局成员! 其他语言中是静态成员。
在Python中还能销毁一个实例! 用到del()函数!在类中加上__del__(self):这个函数是在删除函数的时候执行!
#coding=gbk
class Book:
count = 0
#初始化对象的时候调用
def __init__(self,title,price = '0.0',author = None):
self.title = title
self.price = price
self.author = author
Book.count += 1
#删除对象的时候执行
def __del__(self):
Book.count -= 1
#在控制太打印该对象的时候执行
def __repr__(self):
return '[图书:{} ,定价:{}]'.format(self.title,self.price)
def print_info(self):
print( self.title, self.price,self.author)
if __name__ == '__main__':
book = Book('Python经典',price = 29.0,author = 'Tom')
book2 = Book('Flask')
book3 = Book('ASP.net')
#现在删除一本图书
del(book3)
print('图书的数量:{}'.format(Book.count))
在没有使用del函数的时候输出的是三! 当使用了del函数的时候打印出来的是2
-------------------------------------------------------------
在Python中定义函数的时候,在默认的时候都会加上一个self,这一类属于实例函数。和实例的关系比较密切。如果说不想使用实例的话。只想与类有关的话!怎么定义呢?? 我们有两种方式!
1、 Python2.X延续下来的:
#coding=gbk
class Book:
count = 0
#初始化对象的时候调用
def __init__(self,title,price = '0.0',author = None):
self.title = title
self.price = price
self.author = author
Book.count += 1
#删除对象的时候执行
def __del__(self):
Book.count -= 1
#在控制太打印该对象的时候执行
def __repr__(self):
return '[图书:{} ,定价:{}]'.format(self.title,self.price)
def print_info(self):
print( self.title, self.price,self.author)
#cls只相当于一个占位符
def cls_method(cls):
print('类函数')
if __name__ == '__main__':
book = Book('Python经典',price = 29.0,author = 'Tom')
book2 = Book('Flask')
book3 = Book('ASP.net')
#现在删除一本图书
# del(book3)
# print('图书的数量:{}'.format(Book.count))
Book.cls_method(book2)
主要是看 def cls_method(cls) : 这个函数!在下面是调用了它!这是python2.X设定这样做的! 如果调用的时候不传book2实例的话!就会报错!
2、 在Python3中的写法:可以不加cls,这样写!
#coding=gbk
class Book:
count = 0
#初始化对象的时候调用
def __init__(self,title,price = '0.0',author = None):
self.title = title
self.price = price
self.author = author
Book.count += 1
#删除对象的时候执行
def __del__(self):
Book.count -= 1
#在控制太打印该对象的时候执行
def __repr__(self):
return '[图书:{} ,定价:{}]'.format(self.title,self.price)
def print_info(self):
print( self.title, self.price,self.author)
#cls只相当于一个占位符 。python2.X的写法
def cls_method(cls):
print('类函数')
def static_method():
print('静态函数,逻辑上与实例无关!!')
if __name__ == '__main__':
book = Book('Python经典',price = 29.0,author = 'Tom')
book2 = Book('Flask')
book3 = Book('ASP.net')
#现在删除一本图书
# del(book3)
# print('图书的数量:{}'.format(Book.count))
Book.cls_method(book2)
Book.static_method()
这个看def static_method()这个纷繁,这个方法中是没有传递参数的!在编辑器上面是会报错的!但是不用在意!在python3就是这样的写法!真正意义上面的静态方法。逻辑上与实例无关。 这样无法通过实例去调用这个方法,但是我现在就想通过实例去调用怎么办呢!?只需要在这个方法上面写上一个装饰器 @staticmethod 。这样就可以通过实例去掉用了! 一般不加!
面向对象的实例:定义一个对象来描述一个圆, 分析:将圆作为一个对象,我们关注一个圆! 首先要关注这个圆的半径是多少?面积!周长啊!
#coding=gbk
import math
class Circle:
def __init__(self,redius):
self.redius = redius
def get_area(self):
return math.pi * self.redius ** 2
c = Circle(4.0)
print('圆的面积是:{0}'.format(c.get_area()))
上面是通过普通的方法计算圆的面积! 先面我们使用属性方式进行计算!属性本质是一个函数! 用起来像是一个字段!
#coding=gbk
import math
class Circle:
def __init__(self,redius):
self.redius = redius
@property
def area(self):
return math.pi * self.redius ** 2
# def get_area(self):
# return math.pi * self.redius ** 2
c = Circle(4.0)
print('圆的面积是:{0}'.format(c.area))
上面加上解释器的那个@property的就是一个属性!它将下面的函数解析成为一个属性来用! 运用的时候直接像是使用变量就行了!这就是属性的运用!
模拟公司内部的员工工作的场景:
#coding=gbk
import datetime
class Employee:
def __init__(self,department,name,birthdate,salary):
self.department = department
self.name = name
self.birthdate = birthdate
self.salary = salary
#利用属性的方式修改属性的姓名
@property
def age(self):
return datetime.date.today().year - self.birthdate.year
#调整工资的方法
def give_raise(self,percent,bonus = 0):
self.salary = self.salary * (1 + percent + bonus)
def __repr__(self):
return '<员工:{}>'.format(self.name)
def working(self):
print('{}员工在工作中~~~~~'.format(self.name))
#程序员类
class Programer(Employee):
def __init__(self,department,name,birthdate,salary,specialty,project):
super().__init__(department,name,birthdate,salary)
self.specialty = specialty
self.project = project
def working(self):
print('程序员:{}在开发项目:{}......'.format(self.name,self.project))
#--------------------------------------------调用
if __name__ == '__main__':
p = Programer('技术部','Tom',datetime.date(1990,3,1),8000,'python' ,'CRM')
print('调整薪资之前的员工:{}的薪资是:{} , 员工的年龄为:{}'.format(p.name,p.salary,p.age))
p.give_raise(.2,.1) #调用调薪方法进行调整薪资
print('调整薪资之后的员工:{}的薪资是:{},员工的年龄为:{}'.format(p.name, p.salary,p.age))
上面的就是继承的使用,python是支持多继承的!多继承中在使用基类的时候!分不清用哪个的时候!我们就不能使用super关键字了!就需要直接明确的用基类的名称就行。不过在声明__init__方法的时候!就需要使用self关键字了