面向对象的基本概念

self的意义:

哪一个对象调用的方法,self就是哪一个对象的引用的

在类封装的方法内部,self就表示当前调用方法的对象自己

调用方法时,程序员不需要传递self参数(但是定义的时候,第一个参数必须是self)

在方法内部:可以通过self.访问对象的属性

在方法外部:可以通过self.调用其他的对象方法

 

新式类和旧式(经典)类:

object是Python为所有对象提供的基类,提供有一些内置的属性和方法,可以使用dir函数查看

新式类:以object为基类的类,推荐使用

经典类:不以object为基类的类,不推荐使用

在python3.X中定义的类时,如果没有指定父类,会默认使用object作为基类--python3.x中定义的类都是新式类

在python2.x中定义类时,如果没有指定父类,则不会以object作为基类

#########推荐使用新式类(object类)############

新式类和旧式类在多继承时---会影响到方法的搜索顺序

今后在定义类时,如果没有父类,建议统一继承自object

用object类的目的:

        为保证编写的代码能够同时在python2.x和python3.x运行

 

类的私有属性和私有方法 :

私有属性和私有方法

应用场景及定义方式

应用场景

在实际开发中,对象的某些属性或方法可能只希望在对象的内部使用,而不希望在外部被访问到

私有属性就是对象不希望公开的属性

私有方法就是方法不希望公开的方法

定义属性或方法:

在属性名或者方法名前增加两个下划线,定义的就是私有属性或方法

性质:

1.子类对象不能在自己的方法内部,直接访问父类的私有属性和私有方法

2.子类对象可以通过父类的公有方法间接访问到私有属性或私有方法

私有属性,外界不能直接访问

私有方法,外界不能直接调用

因此,私有属性,私有方法常用做一些内部的事情

例1:

        在子类的对象方法中,不能访问父类的私有属性

class A:
    def __init__(self):
        # 在初始化方法中定义两个属性,一个公有属性一个私有属性
        self.num1 = 100
        self.__num2 = 200

    def __test(self):
        print '私有方法 %d %d' % (self.num1, self.__num2)

    def test(self):
        print '父类的公有方法 %d' % self.__num2
        self.__test()

class B(A):
    def demo(self):
        # 在子类的对象方法中,不能访问父类的私有属性
        print '访问父亲的私有属性 %d' % self.__num2

# 创建一个子类对象
b = B()
b.demo()

面向对象的基本概念_第1张图片

例2:

        在子类对象的方法中,不能调用父类的私有方法

class A:
    def __init__(self):
        # 在初始化方法中定义两个属性,一个公有属性一个私有属性
        self.num1 = 100
        self.__num2 = 200

    def __test(self):
        print '私有方法 %d %d' % (self.num1, self.__num2)

    def test(self):
        print '父类的公有方法 %d' % self.__num2
        self.__test()


class B(A):
    def demo(self):
        # 在子类对象的方法中,不能调用父类的私有方法
         self.__test()

# 创建一个子类对象
b = B()
b.demo()

面向对象的基本概念_第2张图片

例3:

调用父类的公有方法间接访问到父类的私有属性或者私有方法

class A:
    def __init__(self):
        # 在初始化方法中定义两个属性,一个公有属性一个私有属性
        self.num1 = 100
        self.__num2 = 200

    def __test(self):
        print '私有方法 %d %d' % (self.num1, self.__num2)

    def test(self):
        print '父类的公有方法 %d' % self.__num2
        self.__test()


class B(A):
    def demo(self):
        # 调用父类的公有方法
        self.test()

# 创建一个子类对象
b = B()
b.demo()

面向对象的基本概念_第3张图片

初始化方法:

当使用类名()创建对象时,python的解释器会自动执行以下操作:

1.为对象在内存中分配空间--创建对象

2.调用初始化方法为对象的属性设置初始值--初始化方法(__init__)

这个初始化方法就是__init__方法,__init__是对象的内置方法

__init__方法是专门用来定义一个类具有哪些属性的方法

class Cat:
    def __init__(self,new_name): # 与函数一样
        print '这是一个初始化方法'
        # self.属性名= 属性的初始值
        self.name = new_name
    # 在类中,任何方法都可以使用这个self.name
    def eat(self):
        print '%s 爱吃鱼' %self.name
# 并没有调用__init__方法
# 使用类名()创建对象的时候,会自动调用初始化方法__init__
tom = Cat('Tom')
# 在__init__方法的内部使用 self.属性名= 属性的初始值 定义对象的属性
# 定义属性之后,再使用Cat类创建对象,都会拥有该属性
print tom.name
tom.eat()

lazy_cat=Cat('Lazy_cat')
lazy_cat.eat()

面向对象的基本概念_第4张图片

内置方法:

__del__方法:对象被从内存中销毁前,会自动调用

__str__方法:返回对象的描述信息 print 对象

__del__方法:

在python中

        当一个对象被从内存中销毁前(把这个对象从内存中删除掉),会自动调用__del__方法

如果希望在对象被销毁前,再做一些事情,可以考虑一下__del__方法

__str__方法:

      在python中

     使用python输出对象变量,默认情况下,会输出这个变量引用的对象是由哪一个类创建的对象,以及在内存中的地址(十六进制表示)

如果在开发中,希望使用print输出对象变量时,能够打印自定义的内容,就可以利用__str__这个内置方法了

class Cat:
    def __init__(self,new_name):
        self.name = new_name
        print '%s 来了' %self.name
    def __del__(self):
        print '%s 走了' %self.name
    def __str__(self):
        # 必须return 返回一个字符串
        return '我是 %s' %self.name

# tom是一个全局变量
# 所以当我们的代码全部执行完之后,系统才会把tom这个对象进行回收
tom = Cat('Tom')
print tom
print tom.name
# del关键字,可以从内存中删除一个对象,del关键字自己调用了__del__方法,但是慎用
# del tom
# print '*' * 50

面向对象的基本概念_第5张图片


总结:
生命周期
一个对象从调用类名()创建,声明周期开始
一个对象的__del__方法一旦被调用,生命周期就结束
在对象的生命周期内,可以访问对象的属性,调用对象的方法

你可能感兴趣的:(面向对象的基本概念)