面向对象笔记

类的特性:

a.封装

    1.防止数据被随意修改  2.使外部程序不需要关注对象内部的构造,只需要通过对象,对外提供的接口进行直接访问即可

b.继承

   1.子类通过继承父类的方式,以最小代码量的方式,实现不同角色的共同点,和不同点

   2.多继承时,继承顺序的区别  其中python2 就是深度查询,python3就是广度查询

    

C.多态

   pass

什么是类?

  其实类就是一个函数的集合即

class 类:

   def 函数1():

     pass

   def 函数2():

     pass
对象=类()                    #这就是实例化的过程
对象.函数1()                 #这就是实力

所以说对象就是一个类的实例化后实例

属性:

  1.公有属性:在类里直接定义的属性,即是公有属性

  2.私有属性:只能在内部访问,外部不能访问

注:如果外部需要访问的需求,就需要在内部在定义一个关注 这个属性的函数

def get_heart(self):
    return self._heart

如果需要强制访问
r1._Role__heart    

类的写法:

这里就要提新式类和旧式类的对比了,在python3中 采用新式类的方法

经典类 VS 新式类

 用法:   经典类写法:    Persion.__int__(self,name,age)                                #其中Persion 是父类

      新式类写法:  super(Teacger,self).__init__(slef,name,age)       #其中Teacger是子类

言归正传 类如何写:

类的命名规范class Persion(object):                            # Persion 是类的名称 ,首字母必须大写 object后面再提

如果要给类传参数,就必须要使用__init__方法:

__init__是啥? 

    __init__:传参数必须用__init__ 是在类中独特的构造函数,在类被调用时,这个方法会自动执行,进行一些初始化的动作,所以这里可以设置很多属性,

slef是啥? 

    其实self,就是实例本身!你实例化时python会自动把这个实例本身通过self参数传进去

光记录没意思,贴代码吧

class Persion(object):
    def __init__(self,name,age,sex):  #初始化函数,在生成一个角色时要初始化的一些属性就填写在这里
        self.NAME = name
        self.AGE = age
        self.SEX = sex  def sayhai(self):     print(‘you name is %s ‘ %self.name)r1 = Persion(‘zcq‘,‘23‘,‘test‘)      # 这里就是讲zcq 23 test 封装到了name,age,sex 中 r1.sayhai()

总结3点:

  1.上面的r1 = Persion(‘zcq‘,‘23‘,‘test‘) 这个动作,叫做类的“实例化”

  2.上面的r1.sayhai() 就是把一个虚拟的抽象的类,通过这个动作,变成一个具体的对象了,这个对象就叫做实例

  3.刚才定义的这个类体现了面向对象的第一个基本特性,封装,其实就是使用构造方法将内容封装到某个具体对象中,然后通过对象直接或者self间接获取被封装的内容

帖实验代码分析最好了...

class Dog(object):
    member = 100                           #公有属性
    def __init__(self,name,age):      # 构造函数
        self.NAME =name                     #构造函数属性
        self.AGE = age
        self._heart = ‘yes‘
    def sayhai(self):
        print(‘my name is %s , age is %s‘ %(self.NAME,self.AGE))
        self._heart = ‘no‘          #修改私有属性
        print(‘状态 %s‘ %self._heart)
    def b_heart(self):
        return self._heart            #外部调用接口查询私有属性

    def eat(self,food):
        print(‘%s    is eating    状态%s    %s‘ %(self.NAME,self._heart,food))
    def __del__(self):                #析构函数
        print(‘del..........‘)

d=Dog(‘dahong‘,‘5‘)            #实例化
d2=Dog(‘xiaoming‘,‘30‘)      #实例化
print(‘访问__init__的name属性:‘,d.NAME)
d.NAME=‘zcq‘                     #修改构造函数属性
print(‘查询修改构造函数的属性:‘,d.NAME)
print(‘打印私有属性:‘,d.b_heart())

d.sayhai()                            #实例
print(d.b_heart())
d2.sayhai()                          #实例
d2.eat(‘banna‘)                   #传入eat定义的food对应的值
print(d.member)                  # 打印公有属性
Dog.member = 20                #修改公有属性
print(‘第一个实例化的私有属性‘,d.member)
print(‘弟二个实例化的私有属性‘,d2.member)
>>输出

访问__init__的name属性: dahong
查询修改构造函数的属性: zcq
打印私有属性: yes
my name is zcq , age is 5
状态 no
no
my name is xiaoming , age is 30
状态 no
xiaoming is eating 状态no banna
100
第一个实例化的私有属性 20
弟二个实例化的私有属性 20
del..........
del..........

其中__del__析构函数:无论函数有没有被调用都会被执行,   因为 类在被实例化的时候,就已经在内存中开辟了一片空间,用来存放类,这个方法就是用来删除这个实例化的参数,

垃圾回收机制: python3内部会在规定的时间内去,检测内存里没有被变量命名的参数,如果没有就删除  

类的继承代码:

class Persion(object):
    def __init__(self,name,age):
        self.name =name
        self.age = age
        self.sex = ‘noraml‘
    def talk(self):
        print(‘调用talk函数  person is talking ......‘)

class BlackPerson(Persion):

    def __init__(self,name,age,strength): #先继承,在重构   继承父类的时候 ,如果父类有构造函数,子类也必须有 所以这里写了__init__
        self.strength = strength          # 继承父类后,子类也添加构造函数,如果新增功能,子类也必须在self.新方法
        Persion.__init__(self,name,age)
        print(self.name,self.age,self.sex,self.strength)
    def tal(self):
        print(‘调用父类中的talk函数‘ )
        Persion.talk(self.name)           #父类.方法
    def walk(self):
        print(‘is walking......‘)
b=BlackPerson(‘翟超群‘,‘24‘,‘good‘)    #因为调用父类  父类中有构造函数,所以必须穿参
b.tal()
b.walk()>>

翟超群 24 noraml good
调用父类中的talk函数
调用talk函数 person is talking ......
is walking......

 

加强版类的继承

class Persion(object):          #新式类写法
    ‘‘‘学习成员属性父类‘‘‘
    member = 0
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
        self.enroll()          #这里也可以这样写,可以直接调用enroll函数

    def enroll(self):
        ‘‘‘注册‘‘‘
        print(‘欢迎注册%s成功‘ %self.name)
        Persion.member += 1
    def tell(self):
        print(‘------info----%s‘ % self.name)
       # print(self.__dict__)
        for i,j in self.__dict__.items():
            print(i,j)
        print(‘------end----‘)
class Techer(Persion):

    def __init__(self,name,age,sex,salary,course):      #先继承,在重构,这里加了salary,course 2个属性
        #Persion.__init__(self,name,age,sex)   旧式类写法
        super(Techer,self).__init__(name,age,sex)  #新式类写法
        self.salary = salary
        self.course = course
    def techering(self):
        print(‘注册老师为%s,讲解课程为%s‘ %(self.name,self.course))

class Student(Persion):
    def __init__(self,name,age,sex,course,tutian):       #先继承,在重构,这里加了,course,tutian2个属性
        #Persion.__init__(self,name,age,sex) 旧式类的写法
        super(Student,self).__init__(name,age,sex)          #新式类的写法
        self.course = course
        self.tutian = tutian
    def studenting(self):
        print(‘注册学生%s,课程%s,学费%s‘ %(self.name,self.tutian,self.course))
        Persion.member += 1

t1=Techer(‘alex‘,‘25‘,‘F‘,‘1000000‘,‘Python‘)
t2=Student(‘翟超群‘,‘24‘,‘F‘,‘Python‘,‘10001‘)
# ---------- 因为子类调用的父类 所以用父类中的tell 函数执行出结果
t1.tell()
t2.tell()

忘了一点,关于类多继承

class D(object):      #只列出新式类

    def bar(self):
        print ‘D.bar‘

class C(D):

    def bar(self):
        print ‘C.bar‘

class B(D):

    def bar(self):
        print ‘B.bar‘

class A(B, C):

    def bar(self):
        print ‘A.bar‘

a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> C --> D
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()

类的静态方法: (后续再总结)

class Person(object):
    @staticmethod
    def a1():
        print(‘yes‘)
Person.a1()  

 

时间: 2024-08-05 11:16:05

面向对象笔记的相关文章

JS面向对象笔记二

菜单导航,<JS面向对象笔记一>,  参考书籍:阮一峰之<JavaScript标准参考教程> 一.构造函数和new命令 二.this关键字 三.构造函数和new命令 四.构造函数和new命令 五.构造函数和new命令 六.构造函数和new命令 七.构造函数和new命令 八.构造函数和new命令 一.构造函数和new命令 1.构造函数 JavaScript语言的对象体系,不是基于"类"的,而是基于构造函数(constructor)和原型链(prototype) 为

Java面向对象笔记3

Java类必须包含一个或一个以上的构造器,使用构造器最大的好处就是在创建对象时,对类的Field进行初始化(当创 建一个对象的时候,系统为这个对象的Field进行默认初始化,如果是基本类型如数值型赋值为0,如果是引用类型的 Field赋值为null),如以下代码: public class Teacher { private String name; private int age; public Teacher(){ } public Teacher(String name,int age){

Java面向对象笔记5

封装.继承.多态是面向对象的三大特征,继承是实现类重用的重要手段,但是继承会带来一个最大的坏处,那就是破坏 封装.因此接下来介绍组合,组合是实现类重用的重要方式,能提供更好的封装性. 子类扩展父类的时候,可以从父类那里继承得到Field和方法,假设现在我们有足够的权限,那么子类就可以直接复用父 类的Field和方法,但继承在带来高度复用的同时,也带来了一个严重的问题,继承严重的破坏了父类的封装性.在封装 时,我们应该遵守这个原则:每个类都应该封装它内部信息和实现细节,而只暴露必要的方法给其他类使

PHP面向对象笔记解析

PHP的面向对象是很重要的内容,也是很常用的内容.所以现在就把PHP面向对象进行整理了一下. 顺带,我会在后面把我整理的一整套CSS3,PHP,MYSQL的开发的笔记打包放到百度云,有需要可以直接去百度云下载,这样以后你们开发就可以直接翻笔记不用百度搜那么麻烦了.  笔记链接:http://pan.baidu.com/s/1qYdQdKK 密码:pvj2 一.面向对象的基本概念 1.什么是面向对象? 对象 面向 由于目前都还没有一个统一的概念,所以所能理解的就是一个物体被抽象出来,每个物品都是一

面向对象笔记基础

面向对象基础笔记 面向过程 面向对象 类的初步理解 __init__方法的理解 区分类的属性与对象的属性 继承:派生 组合 抽象类 多态与多态性 封装: 类和对象的隐藏属性 面向过程 核心是过程,即解决问题的步骤,比如设计一条流水线, 是机械的思维方式. 优点: 将复杂的问题流程化,进而简单化; 缺点: 可扩展性差; 面向对象 对象就是属性与方法的结合体. 优点: 可扩展性强; 缺点: 编程复杂度高; 应用场景:应对客户不停变化的需求,尤其是互联网应用,游戏和企业内部的应用. 类的初步理解 类是

Java面向对象笔记8

如果将一个类放在另一个类内部,那这个类就被称为内部类,内部类的主要作用如下: 1.内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类. 2.内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,同一个类的成员之间可以互相 访问.但外部类不能访问内部类的实现细节,例如内部类的成员变量. 3.匿名内部类适合用于创建那些仅需要一次使用的类. 成员内部类被分为两种:静态内部类和非静态内部类,使用static修饰的成员内部类是静态内部类,没有使用stat

Java面向对象笔记4

封装.继承.多态是面向对象的三大特征,在Java中什么是多态? Java引用变量有两种类型,分别是编译时类型和运行时类型.何为编译时类型,编译时类型就是由声明该变量时使用的类型决定,而运行时类型是由实际赋给该变量的对象决定 的,也就是说如果编译时类型和运行时类型不一致时,就可能出现上面提到的多态. 我们看下下面的程序: class BaseClass { public String name = "BaseClass"; public void base() { System.out.

java面向对象笔记

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1.面向对象时一种思想,将功能封装进对象,强调具备了功能的对象 2.面向对象三个特征: 封装.继承.多态.  找对象,建立对象,使用对象,维护对象之间的关系 3.类和对象的关系: 类就是对现实生活中事物的描述,是对具体的抽象 对象是这类事物实实在在的个体,具体对象是对应java在堆内存中用new建立的实体 属性对应类中的变量,行为对应类中的函数(方法),共同成为类中的成员(成员变量,成员方法)

面向对象笔记一

js 面向对象的基本概念和基本使用方法 -> js 是不是一个面向对象的语言(众说纷纭)? 不是:与传统面向对象的理论语言有矛盾.C#,Java. 是:js里面到处都是对象,数组,时间,正则... 和 DOM.也可以像传统面向对象的语言那样用 new 的方式创建对象 -> js是一个基于对象的多范式编程语言. 面向过程的方式 面向对象的方式 函数式 递归与链式 例: Jquery 链式编程 比如: 给 div 标签添加样式 $( 'div' ).css( 'border', '1px soli