Python的类、对象和面向对象的编程(类变量和实例变量 & 类的私有属性和私有方法 & 魔术方法 & 析构器)

类、对象和面向对象的编程

      类:一堆函数的集合,是可以实例化出对象的模具,是具有共性的一类事物的统一描述
      实例化: 对象 = 类()      t = turtle.Pen()
      对象:是类实例化出的实体,对象实实在在存在,完成具体工作
      面向对象:程序员反复修改优化类,类实例化出对象,对象调用类里的函数来执行具体的操作

      哺乳动物类是动物类的子类,是在动物的基础上多了喂奶的功能。

      猫是哺乳动物的子类,在哺乳动物的基础上多了捉老鼠的功能

      类具有继承关系,子类将具有自身和父类的功能

类的定义

class  类名(父类名):

          pass

python类的继承是直接类名后括号写上继承的父类,不像Java那样还要extends

一般类的定义括号都是空的,继承会在括号里写上父类

class Animals:

    pass

class Mammals(Animals):

    pass

class Cats(Mammals):

    pass

__init__函数就是构造函数

但__init__函数并不是一定要有的,可以没有

class Animals():
    def breathe(self):
        print('breathing')

    def move(self):
        print('moving')

    def eat(self):
        print('eating food')


class Mammals(Animals):
    def breastfeed(self):
        print('feeding young')


class Cats(Mammals):
    def __init__(self, spots):
        self.spots = spots

    def catch_mouse(self):
        print('catch mouse')

    def left_foot_forward(self):
        print('left foot forward')

    def left_foot_backward(self):
        print('left foot backward')

    def dance(self):
        self.left_foot_forward()
        self.left_foot_backward()
        self.left_foot_forward()
        self.left_foot_backward()


kitty = Cats(10)
print(kitty.spots)
kitty.dance()
kitty.breastfeed()
kitty.move()

运行结果:

  

类变量和实例变量

在python的类中,类的属性有两种作用域:类变量,实例变量

类似于java和c++中的static变量与一般变量的区别。类变量属于整个class所共享,而实例变量则仅仅属于特定对象实例。

类变量是定义在类中的方法外的,通过类名.变量名访问

实例变量是定义在类中的方法里面的,以“self.变量名”的方式定义的变量,只能通过对象名访问,无法通过类名访问。

注意类变量的定义是以“self.变量名”的方式定义,先用先定义,没有那种提前声明

python类的成员变量都是在__init__()方法中定义的,如下面的self.name和self.add,在外面也可以访问,像通过下面的clang.num和clang.add

而say方法中定义的self.catalog和self.x, 是只对say方法管用,类中的其他方法不能使用,也不能通过类名.变量名来访问

class CLanguage:
    num = 1
    def __init__(self):
        self.name = "C语言中文网"
        self.add = "http://c.biancheng.net"
    # 下面定义了一个say实例方法
    def say(self):
        self.catalog = 13
        self.x = self.name


print(CLanguage.num)
clang = CLanguage()
print(clang.name)
print(clang.add)

类的私有属性和私有方法

以两个下划线开头的属性和方法为私有属性和方法,不能在类地外部调用

__private_method:,在类的内部调用 self.__private_methods

class JustCounter:
    __secretCount = 0  # 私有变量
    publicCount = 0    # 公开变量

    def count(self):
        self.__secretCount += 1
        self.publicCount += 1
        print(self.__secretCount)

counter = JustCounter()
counter.count()
counter.count()
print(counter.publicCount)
print counter.__secretCount  # 报错,实例不能访问私有变量
class Cup:

    #构造函数,初始化属性值
    def __init__(self,capacity,color):
        #私有属性,只需要在属性名字前加__
        self.__capacity=capacity
        self.color=color
    #私有方法,只需要在方法名前加__
    def __retain_water(self):
        print("杯子颜色:"+self.color+",杯子容量:"+self.__capacity+",正在装水.")

    def keep_warm(self):
        print("杯子颜色:"+self.color+",杯子容量:"+self.__capacity+",正在保温.")

currentCup=Cup('50ml','紫色')

currentCup.__retain_water()
#外部调用失败,因为__retain_water()方法是私有的

类定义中的特殊方法

特殊方法也称为魔术方法(magic method)

在类定义中实现一些特殊方法,可以方便地使用python中的一些内置操作

所有特殊方法的名称以两个下划线(__)开始和结束

__init__(self,...)就是一个特殊方法,称为对象构造器

起到一个构造函数的作用

析构器

__del__(self,...)

当你销毁一个对象的时候,它就会被自动地调用

from os.path import join 
class Fileobject:
	#给文件对象进行包装从而确认在删除时文件流关闭
	def __init__(self,filepath='~',filename='sample.txt'):
		#读写模式打开一个文件
		self.file = open(join(filepath,filename),'r+')
	
	def __del__(self):
		self.file.close()
		del self.file

算数运算符

反运算

大小比较

字符串操作

也就是说这些magic method是默认存在的,它对应的某个功能,比如说比较大小,在你使用的时候,如 if a>b:

python其实会默认调用__eq__这个方法,他是内置的,而如果你想重定义比较大小的规则的话,你就可以在类里面重写__eq__方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值