Python【类】


1. 类的定义

  • : 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 类方法:类中定义的函数。
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用
  • 局部变量:定义在方法中的变量,只作用于当前实例的类。
  • 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
  • 实例化:创建一个类的实例,类的具体对象。

2. 类的组合使用

1. 组合定义
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合。在Python里组合其实很简单,直接在类定义中把需要的类放进去实例化就可以了

2. 组合的应用例子

  • 圆环
from math import pi

# 先定义一个圆,求圆的周长和面积
class Circle:
    def __init__(self,r = 0):
        self.r = r
    def area(self):
        return pi * (self.r ** 2)
    def perimeter(self):
        return 2 * pi * self.r

# 定义一个圆环,求圆环的周长和面积
class Ring:
    def __init__(self,x,y):
        self.circle_in = Circle(x)
        self.circle_out = Circle(y)
    def get_area(self):
        return self.circle_out.area() - self.circle_in.area()
    def get_perimeter(self):
        return self.circle_in.perimeter() + self.circle_out.perimeter()

ring = Ring(2,7)
print ("面积是 %.2f"%(ring.get_area()))
print ("周长是 %.2f"%(ring.get_perimeter()))

3. 组合调用

class Birthday:
    def __init__(self,year,month,day):
        self.year = year
        self.month = month
        self.day = day

class Company:
    def __init__(self,name,address):
        self.name = name
        self.address = address

class Myself:
    def __init__(self,name,sex,birth,company):
        self.name = name
        self.sex = sex
        self.birth = birth
        self.company = company

m = Myself("胖喵","男",Birthday('1989','02','05'),Company('LOL','艾欧尼亚'))
print(m.name,m.sex,m.birth.year,m.birth.month,m.birth.day)
print(m.name,m.sex,m.company.name,m.company.address)

3. __init____del__

创建对象后,python解释器默认调用__init__()方法。当删除一个对象时,python解释器也会默认调用一个方法,这个方法为__del__()方法。在python中,对于开发者来说很少会直接销毁对象(如果需要,应该使用del关键字销毁)。Python的内存管理机制能够很好的胜任这份工作。也就是说,不管是手动调用del还是由python自动回收都会触发__del__方法

>>> class C:
	count = 0
	def __init__(self,name):
		self.name = name
		C.count += 1
		print("实例对象%s的__init__方法正在被调用,当前C类已有%d个实例对象"%(self.name,C.count))
	def __del__(self):
		C.count -= 1
		print("实例对象%s的__del__方法正在被调用,当前C类已有%d个实例对象"%(self.name,C.count))

		
>>> a = C("小泥鳅")
实例对象小泥鳅的__init__方法正在被调用,当前C类已有1个实例对象
>>> b = C("小乌龟")
实例对象小乌龟的__init__方法正在被调用,当前C类已有2个实例对象
>>> del b
实例对象小乌龟的__del__方法正在被调用,当前C类已有2个实例对象
>>> del a
实例对象小泥鳅的__del__方法正在被调用,当前C类已有1个实例对象

4. __new____init__

构造方法包括创建对象和初始化对象,在python当中,分为两步执行:先执行__new__方法,然后执行__init__方法。

  • __init__是当实例对象创建完成后被调用的,用于设置对象属性的一些初始值。
  • __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。

也就是,__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。

1. 事实上如果(新式)类中没有重写__new__()方法,即在定义新式类时没有重新定义__new__()时,Python默认是调用该类的直接父类的__new__()方法来构造该类的实例,如果该类的父类也没有重写__new__(),那么将一直按此规矩追溯至object的__new__()方法,因为object是所有新式类的基类。

>>> class A():
	def __init__(self):
		print("This is init method")
		print(self)
	def __new__(cls):
		print("This is new method")
		print(id(cls))
		ret = super().__new__(cls)
		print(ret)
		return ret

	
>>> id(A)
1909896244792
>>> a = A()
This is new method
1909896244792
<__main__.A object at 0x000001BCAECB2898>
This is init method
<__main__.A object at 0x000001BCAECB2898>

总结:

__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例
__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值