Python中定义类的相关知识
主要介绍了在python中,抽象类的定义、多态的概念、类中属性的封装以及类中常见的修饰器。
1. 抽象类
与Java一样,Python也有抽象类的概念,抽象类是一个特殊的类。其特殊之处在于
- 只能被继承,不能被实例化;
 - 子类必须完全覆写(实现)其“抽象方法”和“抽象属性”后才能被实例化。
 
可以有两种实现方式: 利用NotImplementedError实现和利用abctractmethod实现
1.1 NotImplementedError
1  | # -*- coding: utf-8 -*-  | 
1.2 abctractmethod
1  | # -*- coding: utf-8 -*-  | 
2. 多态概念
向不同的对象发送同一条消息(obj.func(): 是调用了obj的方法func, 又称向obj发送了一条消息func),不同的对象在接受时会产生不同的行为(即不同的处理方法)。
也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的对象可以执行不同的函数。
例: 男生.放松了(), 女生.放松了(),男生是打篮球,女生是看综艺,虽然二者消息一样,但是处理方法不同。
1  | # -*- coding: utf-8 -*-  | 
3. __属性封装
3.1 私有静态属性、私有方法
1  | # -*- coding: utf-8 -*-  | 
3.2 私有对象属性
1  | # -*- coding: utf-8 -*-  | 
3.3 私有属性不被继承
1  | # -*- coding: utf-8 -*-  | 
4. 类中的常见修饰器
主要介绍最常见的装饰器,classmethod, staticmethod和property
4.1 classmethod
@classmethod
不需要self参数,但是classmethod方法的第一个参数是需要表示自身类的cls 参数;不管是从类本身调用还是从实例化后的对象调用,都用第一个参数把类传进来。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32class DogParent(object):
	__private = 'PRIVATE'
	
    def __init__(self, name):
        self.__name = name
	
	def __func(self):
        print("__DogParent func")
	
	# 类方法
	def change_name(cls, new_name):
		cls.__name = new_name
    def get_name(cls):
        return cls.__name
		
	# 普通方法
    def change_name2(self, new_name):
        self.__name = new_name
    
	def get_name2(self):
        return self.__name
	
if __name__ == '__main__':
	DogParent.change_name(DogParent, "Tom2")
	print(DogParent.get_name(DogParent))
	
	DogParent.change_name2("Tom3")
	print(DogParent.get_name2())
4.2 staticmethod
staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用普通的函数一样;这样有一个好处:
- 有利于我们代码的优雅,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁
 
1  | class DogParent(object):  | 
4.3 property
@property 把一个方法伪装成一个属性,这个属性的值,是这个方法的返回值;这个方法不能有参数,类不能调用,只能对象调用。1
2
3
4
5
6
7
8
9
10
11
12
13class Person(object):
    def __init__(self, name, height, weight):
        self.name = name
        self.height = height
        self.weight = weight
    def bmi(self):
        return self.weight / (self.height ** 2)
    def method(self):
        print("method")
其实,property的作用不仅于此。简单点讲,@property的本质其实就是实现了get,set,delete三种方法。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37class Person(object):
    def __init__(self, name, nickname):
        self.name = name
        self.nickname = nickname
    def nickname(self):
		# 相当于实现了get方法
        print("nickname: {}".self.nickname)
	
	def nickname(self, new_nickname):
		# 相当于实现了set方法
		self.nickname = new_nickname
		print("new nickname: {}".format(new_nickname))
	
	def nickname(self):
		# 相当于实现了delete方法
		del Person.nickname
		print("deleted nickname")
if __name__ == '__main__':
	person = Person("Tom", 'tommmy')
	# get
	person.nickname()
	
	# setter 
	person.nickname = 'new_tommmy'
	
	# deleter
	del person.nickname
	
	#删除完毕后,再次调用报如下错误
	# AttributeError: type object 'person' has no attribute 'nickname'
	# person.nickname
Python中定义类的相关知识