python04 面向对象编程02

为啥要用类而不用函数呢

  1. 记住两个原则:
  • 减少重复代码
  • 代码会经常变更

2    会对变量或字符串的合法性检测(在实例初始化的时候能够统一初始化各个实例的变量,换做函数来说,要弄出同样的变量那么在初始化的时候必须一个一个的去写代码,容易写错。)
    3   类能够隐藏属性或者变量。

具体例子请看这里:http://www.cnblogs.com/alex3714/articles/5188179.html

python 类的三大特性:

  • 1 封装:就是把客观事物封装成抽象的类,而且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏

  • 2 继承:它可以使用现有类的所有功能,并且在无须重新编写原来的类的情况下对这些功能进行扩展,继承是从一般到特殊的过程,父类是定义一般的方法,而子类是有特殊的方法,所以这就是从一般到继承的过程。
  • 3 多态:实现的目的在于对接口的重用

-------------------------------------------------------------------------------------

拿代码去说话:

  python多态:

#!/usr/bin/env python

#定义一个父类
class animal(object):
  #定义一个类变量
  hobbie=‘eat meat‘
  def __init__(self,name):
    self.name=name
  def talk(self):
    print(‘talking.......‘)

#定义一个子类
class dog(animal):
  def talk(self):
  print(‘i am dog ,wangwangwang‘)
  return ‘i am dog ,wangwangwang‘

#定义一个子类,继承父类
class cat(animal):
  def talk(self):
  #print(‘miao miao miao‘)
  return ‘miao miao miao‘

  #定义一个函数,用来调用实例的方法,这样对外的话,我提供了一个接口来分别给使用者调用talk方法
  def animal_talk(obj):
  print(obj.talk())

d=dog(‘ljf‘)
#定义实例的变量,变量名是hobbie,这个实例的hobbie不同于类的hobbie,所以在print的时候只会打印实例的hobbie,
d.hobbie=‘fish‘
print(d.hobbie)
c=cat(‘yq‘)
#这个实例c由于没有自己的类变量hobbie,所以在打印的时候就显示类的变量hobbie
print(c.hobbie)
animal_talk(d)
animal_talk(c)

------------------------------------------------------------------------------------------

类的方法(私有变量和装饰器)

-------------------------------------------------------------------------------------------

#!/usr/bin/env python

class animal(object):  name=‘1990‘  def __init__(self,name):
     self.name=name
      #加了两个下划线后的变量名,此时变为了私有属性,也就是私有变量
      self.__num=‘private‘
  def talk(self):    print("%s are talking"%self.name)

  #类方法,不能够访问实例变量,把walk方法变成了类方法,可以直接类名.方法名调用,但是要注意的是walk里
    # 面的代码块的变量或者其他的对象都应该是类可以访问的。
  @classmethod
  def walk(self):
    #由于添加了类方法的装饰器,所以这里的%s只能用类属性(animal.name,也叫类变量)去赋值给%s,
    print("\t\t%s are talking"%self.name)

  #静态方法,不再传self参数进去。所以不能够访问类变量以及实例变量,如果添加了self,那么就要在调用的时候把实例名传进去
  @staticmethod
  def habit():
    print("%s‘s habbit : walking"%animal.name)
  @property       #把方法变成属性,那么调用的时候可以不用加括号(),一般是为了隐藏该方法
  def runing(self):
    print("%s is running"%self.name)
  def r_private(self):
    return self.__num

  @property
  def total_players(self):
    return self.__num
  #这样可以修改添加了@property里面的值
  @total_players.setter
  def total_players(self,num):
    self.num=num
    print("total players:",self.num)

animal.walk()
d=animal(‘ljf‘)

d.walk()
d.habit()
d.runing
#咱们访问私有变量一般都是写个方法,通过方法返回私有变量
d.r_private()
#下面的直接加两个下划线来访问私有属性是错误的方法
#print(d.__num)
#通过下面的赋值的方法,等于新建了一个__num的变量。这个和私有变量__num是两码事
d.__num=‘ahahh‘
print(d.__num)
#强制访问私有变量,实例名._类名__私有变量名
print(d._animal__num)

1 问如何去访问私有属性

我们一般是在类里面设定一个方法,例子:

class a(object):

......省略一万字

def access_private(self):

return self.__private

b=a()

b.access_private()

如果要用比较暴力的方法去访问的话,那么就只能像下面这样操作

  b._a__private

-------------------------------------------------------------------------------------------

面向对象特性之多态:

#!/usr/bin/env python
class foo(object):
"""
    this class was test
    """
  name=‘ljf‘
  age=‘123‘
  def __init__(self):
    self.tt=‘durex‘
  def f1(self):
    print(‘ssssss‘)
  def __call__(self, *args, **kwargs):
    print("use call method")

a=foo()
#__doc__ 打印类的注释信息
print(a.__doc__)
#__dict__ 打印类里面的类变量,下面a.__dict__是打印实例的变量
print(a.__dict__)
#类或对象中的所有成员(所有变量)
print(foo.__dict__)
#__call__ 这个的话是在类实例化后的对象加个括号出发,如x=class(),x()这样在实例化之后就加个()能够触发
a()
#__init__() 是构造方法,在实例化的时候就会触发执行

#__module__ 和__class__
#__module__表示当前操作的对象在哪个模块里面
#__class__表示当前操作的对象的类是什么
‘‘‘__del__ 析构方法,当对象在内存中被释放时,自动触发执行。注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。‘‘‘

新式类搜索的优先级

在python2.7  2.6版本内是这样的:

1 经典类是深度优先

2 新式类是广度优先

在python3.0 版本是:

不关新式类还是经典类,都是广度优先。

#!/usr/bin/env python
‘‘‘
类的继承之深度优先还是广度优先
‘‘‘

class A:
  def f1(self):
    print("f1 from A")
  def f2(self):
    print("f2 from A")
class B:
  def f1(self):
    print("f1 from B")
  def f2(self):
    print("f2 from B")

class C:
  def f1(self):
    print("f1 from C")
  def f2(self):
  print("f2 from C")
class D(B,C):
  pass
d=D()
‘‘‘此时D继承了类B,C,那么执行f1方法的时候,首先从同样等级的父类的子类里面,从左往右执行。也就是首先从B里面找f1,f2,如果B里面没有f1,f2,那么就找C里面的,C里面也没有的话就往C和B的父类往上找,直到找到为止,这就是广度优先在python2.7  2.6版本内是这样的:1 经典类是深度优先2 新式类是广度优先在python3.0 版本是:不关新式类还是经典类,都是广度优先。‘‘‘d.f1()d.f2()

抽象类:

我们在父类中定义了一个方法

比如

class father(object):

.....

def ChouXiang(self):

pass

子类继承了父类,必须写这个ChouXiang方法,不然它就没法工作,所以子类继承父类后必须重写某个类,那么这个类就叫做抽象类

时间: 2024-10-26 17:15:44

python04 面向对象编程02的相关文章

Python面向对象编程-02

本知识点参考廖雪峰的Python课程 [https://www.liaoxuefeng.com] 感谢北京图灵知非的免费课程 [http://www.tulingxueyuan.com/] 2018/6/26 星期二 11:15:57 继承和多态 继承就是一个类可以获得另外一个类中的成员属性和成员方法 作用: 减少代码,增加代码的复用功能, 同时可以设置类与类直接的关系 继承与被继承的概念: 被继承的类叫父类,也叫基类,也叫超类 用于继承的类,叫子类,也叫派生类 继承与被继承一定存在一个 is-

Accp8.0 S2 02使用Java实现面向对象编程

对象和封装类和对象使用对象的目地:用计算机语言描述现实世界用计算机语言解决现实世界的问题使用面向对象的好处:交流更加流畅提高设计和开发效率怎样实现面向对象编程找出类找出属性(变量)找出行为(方法)类图:"+"为public 公开的"-"为private私有的this关键字,是对一个对象的默认引用,用以区分同名成员变量this关键字,代表当前对象(当前成员变量)构造方法和重载首先对象实例化构造方法无参构造语法访问修饰符 构造方法名(){}作用给成员属性默认赋初始值有参

JAVA的面向对象编程--------课堂笔记

JAVA的面向对象编程--------课堂笔记 面向对象主要针对面向过程. 面向过程的基本单元是函数.   什么是对象:EVERYTHING IS OBJECT(万物皆对象)   所有的事物都有两个方面: 有什么(属性):用来描述对象. 能够做什么(方法):告诉外界对象有那些功能. 后者以前者为基础. 大的对象的属性也可以是一个对象.   为什么要使用面向对象: 首先,面向对象符合人类看待事物的一般规律. 对象的方法的实现细节是屏蔽的,只有对象方法的实现者了解细节. 方法的定义非常重要.方法有参

JavaScript的面向对象编程(OOP)(一)——类

在学习JavaScript面向对象的编程之前,需要知道,并了解面向对象的一些基本的常识.初学者中大多数都以为面向对象中,面向对象的编程是很重要和占据很大一部分精力.笔者在之前也是认为OOP是面向对象的主要部分,那么和我持有一样想法的,下面先要纠正这一想法,真正了解面向对象. 一.初识面向对象 面向对象分为三部分,包括面向对象分析(OOA).面向对象设计(OOD).面向对象的程序设计(OOP). 1.1 OO编程(Object Oriented Analysis) 典型的OO编程过程,应先整理需求

把代码写成艺术,真正体会面向对象编程思想

看到一个严厉的帖子,让自己害怕的瞬身颤抖........... http://www.cnblogs.com/menglin2010/archive/2012/02/08/2342029.html 我们学的是面向对象编程的语言比如:java,c#,我们打着面向对象编程的旗号,却做着面向过程编程的工作 现在我们基本上去一个公司,上去就写代码,老板让我们新增功能,我们就开始写新的方法,做着面向过程编程,每个人都不断地向最初的净地里添自己的代码,最初的代码块就像一个公共厕所一样,每个人都自顾自的在里面

JAVA的面向对象编程

面向对象主要针对面向过程. 面向过程的基本单元是函数. 什么是对象:EVERYTHING IS OBJECT(万物皆对象) 所有的事物都有两个方面: 有什么(属性):用来描述对象. 能够做什么(方法):告诉外界对象有那些功能. 后者以前者为基础. 大的对象的属性也可以是一个对象. 为什么要使用面向对象: 首先,面向对象符合人类看待事物的一般规律. 对象的方法的实现细节是屏蔽的,只有对象方法的实现者了解细节. 方法的定义非常重要.方法有参数,也可能有返回值. 注意区分:对象(本身).对象的实现者.

sdut 上机练习8面向对象编程(对象的数组)

上机练习8面向对象编程(对象的数组) Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 利用类对象数组完毕N个学生数据(学号是字符串类型.成绩是整型)的输入.输出. 输入 输入有N+1行: 第一行的整数N表示学生数目: 下面N行是N个学生的数据,每行中第一个是表示学号的字符串,第二个是表示学生成绩的整数. 输出 输出N个学生数据. 每一个学生的数据占一行. 演示样例输入 5 01 89 02 78 03 56 04 92 05 76 演示样例输出 01

24 Python - 面向对象编程OOP

面向对象编程OOP 01内容回顾 02属性@property本质是函数 未用属性前内容 使用属性后内容 @property  属性本质是函数,但是用起来像字段 03继承.多态示例 继承通过下面的一个基类 和一个派生类讲解 里面用到了继承和多态 [基类] [派生类] [函数调用] 04类嵌套如Employee引用Department 注意:在Employee的init()的参数中用department:Department来说明department是一个类,这样写有利于代码可读性 调用 原文地址:

23 Python - 面向对象编程OOP

面向对象编程OOP 01 方法__repr__()和__str__() __repr__()方法类似java中的toString方法,用于反馈类的相关信息且可以自己定义,一般用于开发人员控制台调试 __rept__()和__str__()方法区别 在控制台交互测试时: 输入b返回__rept__()方法结果 输入print(b) 返回__str__()方法结果,如果没有定义__str__()方法  则用__rept__()结果代替__str__()方法结果 __rept__()   打印信息一般