class面向对象编程学习笔记

1、__ intit__(self,x,xx,xxx,...)
  采用__ init__(self,,xx,xxx,xxxx,...)方法在创建实例时就把属性绑上去,第一个参数一定是self,self指向创建的实例本身
  和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,其他并没有什么差别。但是采用对象编程的一个特点就是数据封装
  和静态语言不同,python允许对实例变量绑定任何数据,比如原本Student类中只有name,score两个属性,但是bart.age=18,可以得到一个新的age属性,但是也只是这个实例有这个属性,Student类中的其他实例并不会有这个age属性。

2、访问限制
  私有变量:在属性前面加两个下划线,如 _ _ name
  特殊变量:属性名称前后都加两个下划线,如 _ _ name _ _ ,特殊变量在外部可以直接访问,不是私有变量
  私有变量是习惯默认外部不能访问,但是python中在外部其实是可以访问的,但是python解释器会改变名称,如 _ _ name,python会改成_ class名__name(不同解释器的名字可能会不同,所以最好不要在外部直接访问)
  如果想在外部访问私有变量,可以采用下面这种方法:

class Student(object):
  pass...

  def get_name(self):
    return self.__name

  def get_score(self):
    return self.__score

  如果允许外部修改,可以采用下面方法:

class Student(object):
  ...
  def set_score(self, score):
    self.__score = score

  虽然当取消私有变量时可以直接修改,但是采用这种方法可以对参数进行检查,防止传入无效参数,比如上面的例子,可以在set_score函数里面判断分数是否在0——100。

class Student(object):
  def __init__(self,name,score):
    self.__name=name    #加__就把变量变为私有的了,外部不能访问
    self.__score=score
  def print_score(self):
    if self.__score>=90:
      print(self.__name,self.__score,‘A‘)
    elif self.__score>=60:
      print(‘%s:%s %s‘ % (self.__name,self.__score,‘B‘))
    else:
      print(‘%s:%s %s‘%(self.__name,self.__score,‘C‘))

bart = Student(‘bart‘,99)
lisa=Student(‘lisa‘,20)
lili=Student(‘lili‘,66)
bart.print_score()
lisa.print_score()
lili.print_score()

print(bart._Student__name)  #私有变量其实在外部是可以访问到的,只是python解释器自动改成了_Stident__name,但是最好不要这样做,因为不同版本的python解释器可能会把__name改成不同的名字

bart.__name=‘new name‘
print(bart.__name)        #因为python解释器把__name改了名字,所以其实这里的bart.__name其实是一个新的变量,原来的bart.__name现在叫做bart._Student__name
print(bart._Student__name)  

结果如下:

3、继承和多态

所有的类最终都会继承object类,所以,没有直接继承的类时,就写class xx(object),有直接继承的类时,括号里面就是父类,如class Dog(Animals) (类的名字一般首字母大写)。

定义一个类就相当于定义了一种数据类型,如:

a = list() # a是list类型
b = Animal() # b是Animal类型
c = Dog() # c是Dog类型

#判断变量是否是某个类型,可以用 isinstance

>>> isinstance(a, list)
True
>>> isinstance(b, Animal)
True
>>> isinstance(c, Dog)
True

但是由于Dog是Animals的子类,所以c也是Animals类型:

>>> isinstance(c, Animal)
True

所以当参数是Animals的函数,传入参数为Animals子类的实例时,也是可以运行的,体现了多态性,即当参数为Animals或子类时,实际调用是看当前的具体对象,调用相应的函数或方法,如下例,函数run_twice是以Animals为参数,但是run_twice(Dog()),run_twice(Tortoise())都可以运行,并且是他们对应的run函数:

class Animal(object):
def run(self):
print(‘Animal is running...‘)

class Dog(Animal):
def run(self):
print(‘Dog is running...‘)

class Tortoise(Animal):
def run(self):
print(‘Tortoise is running slowly...‘)

def run_twice(Animal): #其实在python中,这里的参数不一定为Animals类型(鸭子类型),只要有run函数,不管参数是什么,都可以调用,不过具体调用还是看当前对象及相应方法
Animal.run()
Animal.run()

>>> run_twice(Animal())
Animal is running...
Animal is running...
>>> run_twice(Dog())
Dog is running...
Dog is running...
>>> run_twice(Tortoise())
Tortoise is running slowly...
Tortoise is running slowly...

但是对于python这样的动态语言来说,继承并没有静态语言严格,即如果不是Animals的子类,只要其中含有run方法,则也可调用run_twice函数:

时间: 2024-10-14 12:09:46

class面向对象编程学习笔记的相关文章

PyTorch框架+Python 3面向对象编程学习笔记

一.CNN情感分类中的面向对象部分 sparse.py 1 super(Embedding, self).__init__() 表示需要父类初始化,即要运行父类的_init_(),如果没有这个,则要自定义初始化 1 self.weight = Parameter(torch.Tensor(num_embeddings, embedding_dim)) Parameter跳转 1 class Parameter(Variable): 2 """A kind of Variabl

《Python核心编程》 面向对象编程学习笔记

1. 1. 引言 1. 类与实例 可以定义一个本身没有任何属性的类,而仅把它用做数据的名字空间,这样的类仅作为容器对象来共享名字空间. 示例如下: class MyData(object): pass 下面创建它的实例,它只使用类作为名称空间容器. >>> mathObj = MyData() >>> mathObj.x = 4 >>> mathObj.y = 5 >>> mathObj.x + mathObj.y 9 >>

JavaScript面向对象编程学习笔记

1  Javascript 面向对象编程 所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量.对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上. 自动含有一个constructor属性,指向它们的构造函数. Javascript还提供了一个instanceof运算符,验证原型对象与实例对象之间的关系. Javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象.这个对象的所有属性和方法,都会被构造函数的实例继承.

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

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

Java并发编程学习笔记

Java编程思想,并发编程学习笔记. 一.基本的线程机制 1.定义任务:Runnable接口 线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供.要想定义任务,只需实现Runnable接口并编写run方法,使得该任务可以执行你的命令.   class MyTask implements Runnable {    private String mName;     public MyTask(String name) {    mName = name;   }  

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str

黑马程序员-Java面向对象编程学习总结

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- Java面向对象编程学习总结: 重要知识点总结如下: 1,抽象,封装,继承,多态是面向对象程序设计中得四个特点. 2,面向对象得软件开发大体分为:面向对象的分析,面向对象的设计,面向对象的实现. 可概括为如下过程:分析用户需求,从问题中抽

JAVA GUI编程学习笔记目录

1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之GUI编程窗体事件 6.JAVA之GUI编程Action事件 7.JAVA之GUI编程鼠标事件 8.JAVA之GUI编程键盘码查询器 9.JAVA之GUI编程列出指定目录内容 10.JAVA之GUI编程弹出对话框Dialog 11.JAVA之GUI编程菜单 12.JAVA之GUI编程打开与保存文件 13.JAVA之GUI编程将程序打包jar JA