PYTHON基础知识学习笔记(七)

面向对象

Python从设计之初就已经是一门面向对象的语言,相比较函数,面向对象是更大的封装,根据职责在一个对象中封装多个方法。
步骤如下:
1、OOA面向对象分析:在完成某一个需求前先确定职责——要做的事(方法) ;
2、OOD面向对象设计:根据职责确定不同的对象,在对象内部封装不同的方法(多个) ;
3、OOP面向对象编程:最后完成代码,就是顺序的让不同的对象调用不同的方法 。
例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
面向对象的思想有如下特点:
1、注重对象和职责,不同的对象承担不同的职责 ;
2、更加适合对复杂的需求变化,是专门应对复杂项目的开发,提供的固定套路;
3、需要在面向过程的基础上,再学习一些面向对象的语法。

面向对象技术简介

1、类(Class):用来描述具有相同的属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法,对象是类的实例。
2、对象:通过类定义的数据结构实例,对象包括两个数据成员(类变量和实例变量)以及方法。
3、类变量:类变量在整个实例化的对象中是公用的,类变量定义在类中且在函数体之外,类变量通常不作为实例变量使用。
4、实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
5、方法:类中定义的函数。
6、实例化:创建一个类的实例,类的具体对象。

封装

对于面向对象的封装来说,其实就是使用构造方法将内容封装到对象 中,然后通过对象直接或者self间接获取被封装的内容。

#定义一个名为Book的类
class Book:
    def __init__(self,title,price,author):
        self.title = title
        self.price = price
        self.author = author
 
#实例化
 book1 = Book('python',29.9,'Tom')

#使用
print(book1.title)
print(book1.price)
print(book1.author)

#运行结果
python
29.9
Tom

类的参数可以设置默认值,若实例化时未赋值,则采用默认值。

#定义类
class Book:
    def __init__(self,title,price = 0.0,author = None):
        self.title = title
        self.price = price
        self.author = author

#实例化
 book1 = Book('python')

#使用
print(book1.title)
print(book1.price)
print(book1.author)

#运行结果
python
0.0
None

类中也可以定义函数,称为方法。

#定义类
class Book:
    def __init__(self,title,price,author):
        self.title = title
        self.price = price
        self.author = author
    def print_info(self):
        print('这本书信息如下:')
        print('标题:{}'.format(self.title))
        print('定价:{}'.format(self.price))
        print('作者:{}'.format(self.author))

#实例化
book1 = Book('python',29.9,'Tom')

#使用
book1.print_info()

#运行结果
这本书信息如下:
标题:python
定价:29.9
作者:Tom

如果直接打印实例化的对象,显示的是其在内存中的位置。

print(book1)

#运行结果
<__main__.Book object at 0x000001C4496B9208>

若想打印实例化的对象时显示想要的信息,可以通过__repr__()函数以及__str__()函数实现。

class Book:
    def __init__(self,title,price = 0.0,author = None):
        self.title = title
        self.price = price
        self.author = author
    def __repr__(self):
        return '<图书{}>'.format(self.title)
    def __str__(self):
        return '<图书{}>,价格{}'.format(self.title,self.price)

book1 = Book('python',29.9)
print(book1)

#运行结果
<图书python>,价格29.9         #__str__()函数返回值
        
#在交互式提示符中
>>> book1
<图书python>                 #__repr__()函数返回值
>>> print(book1)
<图书python>,价格29.9         #__str__()函数返回值

继承

继承实现代码的重用,相同的代码不需要重复的编写。当子类继承父类后,子类就会拥有父类的所有方法。
例:程序员属于员工,一些员工共有的属性(如部门、年龄、月薪······)程序员自然也具有,此外程序员还有自己特有的属性(如专长、项目······)。在已经定义员工这一类后,再定义程序员这一类时可以通过继承获得员工的所有属性。

import datetime

#定义父类
class Employee:
    def __init__(self,department,name,birthdata,salary):
        self.department = department
        self.name = name
        self.birthdata = birthdata
        self.salary = salary
    def give_raise(self,percent,bonus=.0):
        self.salary = self.salary * (1 + percent + bonus)
    def __str__(self):
        return '<员工:{}>'.format(self.name)
    def working(self):
        print('员工:{},在工作...'.format(self.name))

#定义子类
class Programer(Employee):
    def __init__(self,department,name,birthdata,salary,specialty,project):
        super().__init__(department,name,birthdata,salary)
        self.specialty = specialty
        self.project = project
    def working(self):
        print('程序员:{}在开发项目:{}'.format(self.name,self.project))

#实例化子类
p = Programer('技术部','Peter',datetime.date(1990,3,1),8000,'Python','CRM')

#使用
print(p)
print(p.name)
print(p.project)
p.working()
print('月薪:{}'.format(p.salary))
p.give_raise(.2,.1)
print('实发工资:{}'.format(p.salary))

#运行结果
<员工:Peter>
Peter
CRM
程序员:Peter在开发项目:CRM
月薪:8000
实发工资:10400.0

多态

不同的子类对象调用相同的父类方法,产生不同的执行结果。

#定义父类
class Employee:
    def __init__(self,department,name,salary):
        self.department = department
        self.name = name
        self.salary = salary
    def working(self):
        print('{}员工{}在工作...'.format(self.department,self.name))

#定义子类1
class Programer(Employee):
    def __init__(self,department,name,salary,specialty,project):
        super().__init__(department,name,salary)
        self.specialty = specialty
        self.project = project
    def working(self):
        print('程序员:{}在开发项目:{}'.format(self.name,self.project))

#定义子类2
class Hr(Employee):
    def __init__(self,department,name,salary):
        super().__init__(department,name,salary)
    def working(self):
        print('人事:{}在考核员工'.format(self.name))


#实例化子类
p = Programer('技术部','Peter',8000,'Python','CRM')
h = Hr('人事部','Tom',7000)

#使用
p.working()
h.working()

#运行结果
程序员:Peter在开发项目:CRM
人事:Tom在考核员工

面向对象的各种方法

静态方法

静态函数,逻辑上与实例无关。

#定义类
class Book:
    def __init__(self,title,price,author):
        self.title = title
        self.price = price
        self.author = author

    #静态函数
    def static_method():
        print('静态函数,逻辑上与实例无关')


#实例化
book1 = Book('python',29.9,'Tom')



#使用:通过类名使用
Book.static_method()
#运行结果
静态函数,逻辑上与实例无关




#使用:通过实例名使用
book1.static_method()
#运行结果
Traceback (most recent call last):
  File "E:/software/pycharm/project/main.py", line 17, in <module>
    book1.static_method()
TypeError: static_method() takes 0 positional arguments but 1 was given

通过@staticmethod也可以设置静态方法,并可以通过实例名调用。

#定义类
class Book:
    def __init__(self,title,price,author):
        self.title = title
        self.price = price
        self.author = author

    #静态函数
    @staticmethod
    def func():
        print('静态函数,逻辑上与实例无关')


#实例化
book1 = Book('python',29.9,'Tom')

#使用
Book.func()
book1.func()

#运行结果
静态函数,逻辑上与实例无关
静态函数,逻辑上与实例无关

属性方法

把一个方法变成一个静态属性。

import datetime

#定义类
class Student:
    def __init__(self,name,birthdate):
        self.name = name
        self.birthdate = birthdate

    @property
    def age(self):
        return datetime.date.today().year - self.birthdate.year

#实例化
s = Student('Tom',datetime.date(1992,3,1))

#使用
print(s.birthdate)
print(s.age)

#运行结果
1992-03-01
28

未完待续!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值