面向对象三大特点

- 封装:既是对数据结构的封装,有是处理数据的方法的封装。
- 继承:强调的父子类的关系。
- 多态:不同对象调用相同的方法,有不同的响应。 类的继承 - 相关概念
- 继承:父类的方法和属性,子类直接拥有,称为继承。
- 派生:子类在父类的基础上衍生出新的特征(属性和行为)。
- 总结:其实他们是一回事,只是描述问题的角度不同(继承强调相同点,派生强调不同点)
- 继承语法:
# class Animal:
# 当没有写父类时,默认继承自object
class Animal(object):
def __init__(self, name):
self.name = name def run(self):
print('小动物喜欢一天到晚跑个不停') # 继承自另一个类
class Dog(Animal):
pass d = Dog('旺财')
# 直接拥有父类的属性
print(d.name)
# 也拥有父类的行为
d.run()
- 派生示例
class Animal:
def run(self):
print('一天到晚不停的跑') class Cat(Animal):
def eat(self):
print('猫喜欢吃鱼') c = Cat() # 继承的方法
c.run()
# 衍生的发生
c.eat()
# 动态添加属性
c.color = '白色'
print(c.color) - 方法重写
- 父类的方法完全不合适,可以覆盖重写
- 父类的不是完全合适,可以添加完善
- 示例
class Animal:
def eat(self):
print('小动物一天到晚吃个不停') def run(self):
print('小动物一天到晚跑个不停') class Cat(Animal):
# 完全不合适,覆盖重写
def run(self):
print('俺走的是猫步') # 父类的方法不够完善,需要添加完善
def eat(self):
# 保留父类方法中的内容
# Animal.eat(self) # 不建议使用
# super(Cat, self).eat()
# 简化方案,推荐使用
super().eat()
print('俺喜欢吃鱼') c = Cat()
c.run()
c.eat()
- 多继承:一个类可以有多个父类
class A:
def eat(self):
print('eat func in class A') class B:
def eat(self):
print('eat func in class B') def test(self):
print('test func in class B') class C(A, B):
def eat(self):
# 不重写方法,或者使用super,都是按照书写的先后顺序
# 默认会使用前面的类的方法
# super().eat()
# 明确指定调用哪个父类的方法
B.eat(self) c = C() c.eat()
c.test() - 访问权限
- 权限
- 公有的:类中的普通的属性和方法,默认都是公有的;可以在类外、类内以及子类中使用。
- 私有的:定义时在前面添加两个下划线即可,只能在本类中使用,类外及子类中不能使用
- 示例
class Person:
def __init__(self, name):
self.name = name
self.__age = 20 def test(self):
# 可以在类的内部使用
print(self.__age) def __hello(self):
print('hello world!') class Man(Person):
def introduce(self):
# 私有属性不能在子类中使用
print('我叫{},今年{}岁'.format(self.name, self.__age)) p = Person('小明')
# print(p.name)
# 当属性前添加两个下划线后,无法在外部访问
# print(p.age)
# print(p.__age)
# print(p.__dict__)
# 默认加两个下划线的属性名前面添加了'_类名'
# 不建议访问
# print(p._Person__age)
# p.test() # p.__hello() m = Man('ergou')
# m.introduce()
print(m.__dict__)
- 类属性
- 说明:定义在类中,但是在方法外的属性,通常会放在类的开头,这样的属性称为类属性
- 示例:
class Person:
# 类属性
# nation = '中国' # 限制对象可以使用的属性,可以提高访问的效率
__slots__ = ('name', 'age', 'nation') def __init__(self, name):
self.name = name
self.nation = 'china' # 通过类名访问类属性
print(Person.nation)
p = Person('小明')
print(p.name)
# 通过对象也可以访问类属性,但是不建议
print(p.nation) # 特殊的类属性 # 类名字符串
print(Person.__name__) # 基类组成的元组
print(Person.__bases__) # 类相关的信息
print(Person.__dict__) print(Person.__slots__) p.age = 20
# p.xxx = 'yyy' - 类方法
- 说明:
- 通过类名调用的方法
- 定义时通过装饰器classmethod进行装饰的方法
- 作用:
- 可以创建对象或简洁的创建对象
- 可以对外提供简洁易用的接口
- 示例1:创建对象
class Person:
def eat(self):
print('我喜欢吃麻辣烫,不要麻椒和辣椒') # 定义类方法
@classmethod
def test(cls):
# cls:表示当前类
print(cls, '类方法') @classmethod
def create(cls):
p = cls()
p.age = 1
return p xiaoming = Person()
xiaoming.eat() # 类方法通过类名调用
Person.test() # 创建或简洁的创建对象
xiaohua = Person.create()
print(xiaohua.age) - 示例2:对外提供简单易用的接口
class Number:
def __init__(self, num1, num2):
self.num1 = num1
self.num2 = num2 def add(self):
return self.num1 + self.num2 def sub(self):
return self.num1 - self.num2 def mul(self):
return self.num1 * self.num2 def div(self):
if self.num2 == 0:
return None
return self.num1 / self.num2 @classmethod
def pingfanghe(cls, num1, num2):
n1 = cls(num1, num1)
n12 = n1.mul() n2 = cls(num2, num2)
n22 = n2.mul() n3 = cls(n12, n22)
return n3.add() ret = Number.pingfanghe(3, 4)
print(ret) - 静态方法
- 说明:
- 定义时通过装饰器staticmethod装饰的方法
- 也是通过类名进行调用
- 示例
class Person:
@staticmethod
def test():
print('static method test') # 也可以创建对象
@staticmethod
def create():
p = Person()
p.age = 20
return p Person.test()
p = Person.create()
print(type(p)) - 总结:
- 凡是静态方法能够完成的功能都可使用类方法进行完成
- 若方法中没有使用到类名(cls),都可以使用静态方法
- 多态特性
- 定义:不同的对象,调用调用相同的方法,有不同的响应。
- 示例:
class Animal:
def run(self):
print('小动物走道都不一样') class Dog(Animal):
def run(self):
print('狗通常走S型') class Cat(Animal):
def run(self):
print('猫一般走猫步') def func(obj):
obj.run() func(Cat())
func(Dog())
- 属性函数
- 说明:将成员方法当做属性一样进行访问。
- 作用:保护特定属性,或者对属性进行特定的处理。
- 示例:
class User:
def __init__(self, username, password):
self.username = username
self.__password = password # 可以保护指定的属性
@property
def password(self):
print('有人想偷看密码')
return '想看密码,没门' # 设置属性时,自动调用
@password.setter
def password(self, password):
print('加密存储密码')
self.__password = '加密' + password + '加密' u = User('xiaoming', '123456')
print(u.username, u.password) u.password = 'abcd'
print(u.__dict__)

python学习总结---面向对象2的更多相关文章

  1. Python学习之==>面向对象编程(二)

    一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...

  2. Python学习一(面向对象和函数式编程)

    学习了一周的Python,虽然一本书还没看完但是也收获颇多,作为一个老码农竟然想起了曾经荒废好久的园子,写点东西当做是学习笔记吧 对Python的语法看的七七八八了,比较让我关注的还是他编程的思想,那 ...

  3. 从0开始的Python学习014面向对象编程

     简介 到目前为止,我们的编程都是根据数据的函数和语句块来设计的,面向过程的编程.还有一种我们将数据和功能结合起来使用对象的形式,使用它里面的数据和方法这种方法叫做面向对象的编程. 类和对象是面向对象 ...

  4. python学习 day23 面向对象三大特性之继承

    ### 面向对象三大特性值继承#### 1.什么是继承 继承是一种关系,必须存在两个对象才可能产生这种关系,在现实生活中的继承,王思聪可以继承王健林的财产 被继承的成为父,继承的一方成为子 在程序中, ...

  5. Python学习-day6 面向对象概念

    开始学习面向对象,可以说之前的学习和编程思路都是面向过程的,从上到下,一步一步走完. 如果说一个简单的需求,用面向过程实现起来相对容易,但是如果在日常生产,面向对象就可以发挥出他的优势了. 程序的可扩 ...

  6. Python学习之面向对象基础

    python的面向对象和以前学的c++,Java都是一般,大同小异,面向对象基础先谈谈类的构造,编写,属性和方法的可见性等等 1.定义类,创建和使用对象 #定义类 class Student(obje ...

  7. Python学习--10 面向对象编程

    面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 本节对于面向对象的概念不做 ...

  8. python学习总结(面向对象进阶)

    -------------------类属性和实例属性关系------------------- 1.类属性和实例属性关系     1.实例属性         实例对象独有的属性     2.类属性 ...

  9. python学习day19 面向对象(一)封装/多态/继承

    面向对象 封装思想:将同一类的函数函数封装到同一个py文件中,方便调用 面向对象也有封装的作用,将同一类的函数封装到一个类中 多态(鸭子模型):多种类型/多种形态 #,什么事鸭子模型 对于一个函数,p ...

  10. python学习笔记----面向对象

    面向对象 类:成员变量(属性) 方法(操作成员变量) 出一个场景:玩过游戏.主人公,进入了一个场景,有10个小怪物是一样的.有攻击力,血(100格).如果小怪物有多个数值需要管理,小怪物的血量.小怪物 ...

随机推荐

  1. 【Java-Regex】该用正则表达式却偷懒使用 indexOf 引起的BUG

    留着等下写. 背景 Excel列内容,无法获取全部格式,但我们有最终的准确格式. 用准确格式去严格匹配,而不是盲人摸象. 不符合就置为空,符合就.

  2. Velocity中加载vm文件的三种方式

    Velocity中加载vm文件的三种方式: a.  加载classpath目录下的vm文件 /** * 初始化Velocity引擎 * --VelocityEngine是单例模式,线程安全 * @th ...

  3. 1.初识Quartz

    开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/QuartzDemo.git 前言: 接触一个新事物的开始,我们都会产生一些疑问: Quartz是什 ...

  4. LeetCode77. Combinations(剑指offer38-2)

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. Example: I ...

  5. poj_2689_Prime Distance

    The branch of mathematics called number theory is about properties of numbers. One of the areas that ...

  6. jstree 全部选中事件 select_all 使用

    select_all function of jstree not checked node for jstree-open branch of ajax-jstree 很尴尬啊,找了整个百度,360 ...

  7. 基于Ceph分布式集群实现docker跨主机共享数据卷

    上篇文章介绍了如何使用docker部署Ceph分布式存储集群,本篇在此基础之上,介绍如何基于Ceph分布式存储集群实现docker跨主机共享数据卷. 1.环境准备 在原来的环境基础之上,新增一台cen ...

  8. django+xadmin在线教育平台(十三)

    这个6-8对应对应6-11,6-12 拷入forgetpassword页面 书写处理忘记密码的view users/views.py # 用户忘记密码的处理view class ForgetPwdVi ...

  9. gdb-pada调试实例

    先编写个简单的hello的程序 hello.c (ps:有没有头文件行不行,试试不就知道了) int main(){ printf("hello!\n"); int m,n; in ...

  10. java 计算数学表达式及执行脚本语言

    java SE6中对常用的脚本语言做了支持. 可供使用者在java代码中执行脚本语言,还可以利用get("key"),put("key","value ...