一、私有化

1、定义

(1)私有化

如果想让类的内部属性不被外界直接访问,可以在这个属性的前面加两个下划线__ ,在 Python中,如果一个属性的前面出现 __,就表示这个属性只能在当前类的方法中被直接访问,不能通过对象直接访问,这个变量就被称为私有变量。

  • __属性: 就是将属性私有化,访问范围仅仅限于类中

(2)封装

  • 私有化属性
  • 定义公有set和get方法
class Student:# __age = 18  类属性def __init__(self,name,age):self.name = name    # 长度为六位self.__age = ageself.__score = 59# 定义公有set和get方法# set为了赋值def setAge(self,age):if age > 0 and age < 120:self.__age = ageelse:print('年龄不在规定范围')# get为了取值def getAge(self):return self.__age# 修改名字长度必须为6def setName(self,name):if len(name) == 6:self.name = nameelse:print('名字不是六位')def __str__(self):return '姓名:{},年龄:{},考试分数:{}'.format(self.name,self.__age,self.__score)yupeng = Student('yupeng','18')
print(yupeng)
yupeng.setAge(20)
print(yupeng)
# yupeng.name = 'xiaopeng'
yupeng.setName('xiaopeng')
print(yupeng)# 拿到于鹏年龄
print(yupeng.getAge())feifei = Student('feifei','21')
print(feifei)
# yupeng.age = 21
# print(yupeng.__score)
# yupeng.__score = 95
# print(yupeng)

(3)好处

  • 隐藏属性不被外界随意修改
  • 也可以修改:
def setXXX(self,xxx):筛选赋值的内容if xxx是否符合条件赋值else:不赋值
  • 如果想获取具体的某一个属性,使用get函数 :
def getXXX(self):return self.__xxx
class Student:def __init__(self, name, age):self.__name = nameself.__age = agedef setName(self, name):if len(name) == 6:self.__name = nameelse:print('名字必须6位')def getName(self):return self.__namedef __str__(self):return '姓名:{},年龄:{}'.format(self.__name, self.__age)# attribute: setName  getName  __str__  __init__s = Student('yupeng', 18)print(s)print(dir(Student))print(dir(s))
# print(s.__name)  # _Student__name
print(s._Student__age)  # 其实它就是__age ,只不过系统自动改名字了。
print(s.__dir__())
print(__name__)

2、开发中的私有化处理:装饰器

class Student:def __init__(self, name, age):self.name = nameself.__age = age# 先有getxxx,@propertydef age(self):return self.__age# 再有set,因为set依赖get@age.setterdef age(self, age):if age > 0 and age < 100:self.__age = ageelse:print('不在规定的范围内')# def setAge(self, age):#     if age > 0 and age < 100:#         self.__age = age#     else:#         print('不在规定的范围内')## def getAge(self):#     return self.__agedef __str__(self):return '姓名:{},年龄:{}'.format(self.name, self.__age)s = Student('peng', 20)
s.name = 'xiaopeng'
print(s.name)s.age = 130
print(s.age)
print(s.__dir__())# 私有化赋值
# s.setAge(30)
# print(s.getAge())

二、关联关系

1、has a

一个类中使用了另外一种自定义的类型,例如:student使用computer book

2. 类型

系统类型: str int float list dict tuple set

自定义类型: 算是自定义的类,都可以将其当成一种类型,

s = Student()-------s是Student类型的对象

class Computer:def __init__(self, brand, type, color):self.brand = brandself.type = typeself.color = colordef online(self):print('正在使用电脑上网....')def __str__(self):return self.brand + '---' + self.type + "---" + self.colorclass Book:def __init__(self, bname, author, number):self.bname = bnameself.author = authorself.number = numberdef __str__(self):return self.bname + '---' + self.author + '----' + str(self.number)class Student:  # has adef __init__(self, name, computer, book):self.name = nameself.computer = computerself.books = []self.books.append(book)def borrow_book(self, book):for book1 in self.books:if book1.bname == book.bname:print('已经借过此书!')breakelse:# 将参数book添加到列表中self.books.append(book)print('添加成功!')def show_book(self):for book in self.books:  # book就是一个book对象print(book.bname)def __str__(self):return self.name + "---" + str(self.computer) + '--------' + str(self.books)# 创建对象
computer = Computer('mac', 'mac pro 2018', '深灰色')book = Book('盗墓笔记', '南派三叔', 10)stu = Student('songsong', computer, book)
print(stu)# 看借了哪些书
stu.show_book()book1 = Book('鬼吹灯', '天下霸唱', 8)stu.borrow_book(book1)print('---------------------')stu.show_book()list1 = [12, 'abc', [1, 2, 3], book, computer]

三、继承关系

1、介绍

Student,Employee,Doctor ----- 都属于人类      相同代码 ------代码冗余,可读性不高

将相同代码提取-----Person类 Student,Employee,Doctor ---》 继承Person class

格式:Student(Person): pass

class Person:def __init__(self, name):self.name = nameself.age = 18def eat(self):print(self.name + "正在吃饭...")def run(self):print(self.name + '正在跑步...')class Student(Person):def __init__(self, name):print('---------->student的init')# 如何调用父类__init__super().__init__(name)  # super()  父类对象class Employee(Person):passclass Doctor(Person):passs = Student("jack")
s.run()
e = Employee('lily')
e.run()
d = Doctor('tom')
d.run()

2、特点

  • 如果类中不定义__init__,调用父类 super class的__init__
  • 如果类继承父类也需要定义自己的__init__,就需要在当前类的__init__调用一下父类__init__
  • 如何调用父类__init__:      super().__init__(参数)           super(类名,对象).__init__(参数)
  • 如果父类有eat(),子类也定义一个eat方法,默认搜索的原则:先找当前类,再去找父类 s.eat() override: 重写(覆盖),父类提供的方法不能满足子类的需求,就需要在子类中定义一个同名的方法,这种行为:重写
  • 子类的方法中也可以调用父类方法: super().方法名(参数)
class Person:def __init__(self, name, age):self.name = nameself.age = agedef eat(self):print(self.name + "正在吃饭...")def run(self):print(self.name + '正在跑步...')class Student(Person):def __init__(self, name, age, clazz):super().__init__(name, age)self.clazz = clazzdef study(self, course):print('{}正在学习{}课程'.format(self.name, course))def eat(self, food):super().eat()print(self.name + "正在吃饭...,喜欢吃:" + food)class Employee(Person):def __init__(self, name, age, salary, manager):super().__init__(name, age)self.salary = salaryself.manager = managerclass Doctor(Person):def __init__(self, name, age, patients):super(Doctor, self).__init__(name, age)self.patients = patientss = Student('阿文', 18, 'python1905')
s.run()
s.study('python基础')
s.eat('满汉全席')e = Employee('tom', 23, 10000, 'king')
e.run()lists = ['zhangsan', 'lisi', 'wangwu', 'zhaoliu']
d = Doctor('lucy', 30, lists)
d.run()

练习:编写一个简单的工资管理程序,系统可以管理以下四类人:工人(worker)、销售员(salesman)、经理(manager)、销售经理(salemanger)。所有的员工都具有员工号,姓名,工资等属性,有设置姓名,获取姓名,获取员工号,计算工资等方法。
  1)工人:工人具有工作小时数和时薪的属性,工资计算法方法为工作小时数*时薪。
  2)销售员:具有销售额和提成比例的属性,工资计算方法为销售额*提成比例。
  3)经理:具有固定月薪的属性,工资计算方法为固定月薪。
  4)销售经理:工资计算方法为销售额*提成比例+固定月薪。

class Person:def __init__(self, no, name, salary):self.no = noself.name = nameself.salary = salarydef __str__(self):msg = '工号:{},姓名:{},本月工资:{}'.format(self.no, self.name, self.salary)return msgdef getSalary(self):return self.salaryclass Worker(Person):def __init__(self, no, name, salary, hours, per_hour):super().__init__(no, name, salary)self.hours = hoursself.per_hour = per_hourdef getSalary(self):money = self.hours * self.per_hourself.salary += moneyreturn self.salaryclass Salesman(Person):def __init__(self, no, name, salary, salemoney, percent):super().__init__(no, name, salary)self.salemoney = salemoneyself.percent = percentdef getSalary(self):money = self.salemoney * self.percentself.salary += moneyreturn self.salary# 创建子类对象
w = Worker('001', 'king', 2000, 160, 50)
s = w.getSalary()
print('月薪是:', s)
print(w)
print('----------------------------------------')
saler = Salesman('002', 'lucy', 5000, 50000000, 0.003)
s = saler.getSalary()
print('月薪是:', s)
print(saler)

3、多重继承

python允许多继承

(1)格式如下:

def 子类(父类1,父类2,..): pass
class Base:def test(self):print('---------Base-----------')class A(Base):def test(self):print('--->AAAAAAAAAA')class B(Base):def test(self):print('----------->BBBBBBBB')class C(Base):def test(self):print('----------->CCCCCCCCC')class D(A, B, C):passd = D()
d.test()import inspect
print(inspect.getmro(D))
print(D.__mro__)

(2)多继承的搜索顺序:

  • 经典类:从左至右,深度优先
  • 新式类:广度优先
class P1(object):def foo(self):print('p1--->foo')def bar(self):print('p1--->bar')class P2(object):def foo(self):print('p2--->foo')class C1(P1, P2):passclass C2(P1, P2):def bar(self):print('C2---->bar')class D(C1, C2):passd = D()
print(D.__mro__)d.foo()
d.bar()

查看搜索顺序 :

  • D.__mro__
  • import inspect     inspect.getmro(D)

Python基础教程—私有化相关推荐

  1. 编程入门书籍-Python基础教程(第3版)

    Python基础教程(第3版) Magnus Lie Hetland 著,袁国忠 译 ISBN:9787115474889 包装:平装 开本:16开 正文语种:中文 出版社:人民邮电出版社 出版时间: ...

  2. Python基础教程学习笔记:第一章 基础知识

    Python基础教程 第二版 学习笔记 1.python的每一个语句的后面可以添加分号也可以不添加分号:在一行有多条语句的时候,必须使用分号加以区分 2.查看Python版本号,在Dos窗口中输入&q ...

  3. python基础教程博客_python基础教程(一)

    之所以选择py交易有以下几点:1.python是胶水语言(跨平台),2.python无所不能(除了底层),3.python编写方便(notepad++等文本编辑器就能搞事情),4.渗透方面很多脚本都是 ...

  4. python基础教程第二版和第三版哪个好-python基础教程 2版和3版哪个适合新手?!...

    python基础教程 2版和3版哪个适合新手? 现在学是学python3. 两者的差异发者本身影响并不大,个别语法细微的差比如python3的print数方式使用,一些常用模块的名称差异,一些机制的差 ...

  5. python基础教程第二版答案-《Python基础教程》(第2版修订版)中要注意的地方...

    想必现在大家学习Python都会用3.0及以上的版本了,虽然2.X的版本依然很多,但是这两年随着部分开源项目不再支持2.X版本,3.X已经成为趋势. 正是在这样的大背景下,我最近用这本<Pyth ...

  6. python基础教程第三版电子版百度云-《python基础教程第三版》高清版PDF免费下载...

    下载地址1:http://t.cn/EGxO1sW Python基础教程 第3版Python简明教程书籍 Python编程从入门到实践 灵程序设计丛书 <python基础教程第三版>高清版 ...

  7. python基础教程视频(全13集)-Python基础视频教程(600集)【传智播客精品教程】...

    Python基础视频教程 初级共600节课 本套视频是传智播客紧抓未来最大趋势--人工智能,应运而生的一套Python入门视频教程,Python是学习人工智能的首选语言,而该视频是专门针对零基础的学员 ...

  8. python基础教程第三版和第二版选哪个-python基础教程 2版和3版哪个适合新手?!...

    python基础教程 2版和3版哪个适合新手? 现在学是学python3. 两者的差异发者本身影响并不大,个别语法细微的差比如python3的print数方式使用,一些常用模块的名称差异,一些机制的差 ...

  9. python基础教程第二版和第三版有什么区别-《Python基础教程》(第2版修订版)中要注意的地方...

    想必现在大家学习Python都会用3.0及以上的版本了,虽然2.X的版本依然很多,但是这两年随着部分开源项目不再支持2.X版本,3.X已经成为趋势. 正是在这样的大背景下,我最近用这本<Pyth ...

最新文章

  1. HttpMessageConverter转换类型
  2. FPGA/IC技术交流2020
  3. Java内部类(Inner Class)小记
  4. 【SpringMVC】从Fastjson迁移到Jackson,以及对技术选型的反思
  5. Ⅴ:zookeeper的相关Java Api
  6. [C++STL]C++实现list容器
  7. php7 cms,PHP7CMS 无条件前台GETSHELL
  8. 网络商务信息与计算机的关系,计算机与电子商务的关系,
  9. java 中文乱码过滤器_JAVA中文乱码过滤器(用java过滤器解决中文乱码)V0422 整理版...
  10. 屏幕为什么要正负压供电_焦炉煤气脱硫为什么要选择负压脱硫工艺?
  11. 为什么我在腾讯待了近十年,还是离了职?
  12. HTRAN 2.4终极使用
  13. Spring+Mybatis+SpringMVC后台与前台分页展示实例(附工程)(转)
  14. visual studio 2012 密钥记录
  15. 第三讲 汇编语言程序
  16. 阿里云大学双11特惠活动
  17. QT实现点击按钮打开和关闭窗口
  18. 新中大计算机知识,新中大软件操作步骤
  19. 【stata】如何快速上手stata软件
  20. windows10 win10 此电脑 文件夹 隐藏

热门文章

  1. 对抗样本(论文解读八):Towards More Robust Adversarial Attack Against Real World Object Detectors
  2. 微信支付的统一下单小demo
  3. 中型企业适合用什么样的CRM管理软件,求推荐?
  4. 重新系统(win11)以后,西部硬盘(机械硬盘)识别不了
  5. 他成绩一般,大二却破解世界难题,三院士致信中央,22岁破格成教授
  6. 图像处理--OpenCV实现图像加噪与滤波
  7. 1167 susan的货币兑换
  8. 【二维码】二维码生成
  9. Photoshop切片工具的使用
  10. part 8: comparison between OOL and FL