Python学习第八天--面向对象编程

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关键字了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值