python定义类中的方法和属性的不同情况

参考:http://www.coolpython.net/python_primary/easy_oop/easy-oop-tk-attr-method-2.html

简单的总结,定义不同的类型的属性和方法的作用

'''
实例方法里,不能修改类的属性,
在类方法里,不能修改实例的属性,
在静态方法里,既不能修改实例的属性,也不能修改类的属性。通过这种限制,最大程度上保护了数据。
'''

程序实例

class NovelBook():
	book_type = '小说'  #在函数定义外的都是类属性
	test_type = 'bate'
	def __init__(self, _name, _author, _price): # init中定义的都是实例属性
		self.name = _name  # 书名            # 实例属性
		self.author = _author  # 作者
		self.price = _price  # 价格
	def discount(self, ratio):   # 实例方法
		self.price *= ratio
	@classmethod          #通过装饰器修饰的类属性
	def out_type(cls):
		print('这是out_type中的:',cls.book_type)
	@classmethod
	def set_type(cls, _type):
		cls.test_type = '32345'
		# slef.name = 'bat'  # 这是类的方法不能修改实例属性
		print('这是set_type中的:',cls)
		cls.book_type = _type
	@staticmethod                #通过装饰器修饰的静态属性
	def off_the_shelf():
		print("商品下架")
book = NovelBook('西游记', '吴承恩', 99)  #实例化一个类的对象
book.set_type('魔幻小说')   # 这个也是修改了类的属性,效果和下面的作用一样
NovelBook.set_type('魔幻小说')  #使用类方法,修改了类属性# 结果:#   这是set_type中的: 
print(book.book_type)      # 结果显示:魔幻小说

python定义类中的方法和属性的不同情况_第1张图片

对象、方法和属性的关系

python定义类中的方法和属性的不同情况_第2张图片

类调用实例化方法

例如,定义一个实例化方法

# 定义实例化方法
def discount(self, ratio):   # 实例方法
	# self.price *= ratio
	price = ratio
# 使用类名调用该方法
类名.('随意参数',9) #这里的第一个参数并未使用,这是作为一个占位,而且传入的参数必不可少

python定义类中的方法和属性的不同情况_第3张图片

需要注意

一、若类方法中使用了实例属性,但该类方法并未调用编译是不会出现错误的;但若是使用了该方法,就会报错:没有self定义。
二、使用实例变量.类属性= 赋值,这种格式并不会修改类的属性,但会修改实例对象的相同属性

book = NovelBook('西游记', '吴承恩', 99)  #实例化一个类的对象
book.book_type = '魔幻小说'  # 这使用实例对象对类的对象赋值
print(book.book_type)      # 结果显示:魔幻小说
print(NovelBook.book_type) # 结果显示还是:小说

你可能感兴趣的:(一些自己的小用法,笔记,python,类的定义和实例对象,类)