面向对象篇
“如果你读自己6个月前写的代码并且感觉仍然很好,那么可能就有些不对劲了。这通常意味着你这6个月没有学到新东西。” ----Brett Cannon
“一切皆对象”是Python编程的核心思想之一。面向对象编程是Python的一大特色,今天将深入探索Python中的 类方法、 静态方法和普通的 实例方法。
1.@classmethod
– 类方法
(1) 在类的方法中使用@classmethod
标记方法为类方法。类方法并不接受self
参数,而是接受cls
参数,使用cls
指向类本身,而不是对象实例。 因此类方法不能改变对象实例的状态。
class User:
authority = ['visitor'] # 类的属性
def __init__(self, name, passwd):
self.name = name # self.name: 实例的属性
self.passwd = passwd
@property
def password(self):
print("This's a private attribuition")
return None
@classmethod
def authorityUper(cls):
User.authority.append('admin')
if __name__ == '__main__':
user1 = User('Tom', '123')
user2 = User('Jenny', '1234')
print(user1.authority)
user2.authorityUper()
print(user1.authority)
['visitor']
['visitor', 'admin']
类方法在实例中调用,可以修改类的属性,从而修改所有实例的属性。
(2)调用类方法还可以返回该类的实例,可快速获得不同的默认方案实例。
比如下面的设置餐厅的默认菜单…
class Menu:
def __init__(self, default):
self.default = default
@classmethod
def IndianDeault(cls):
return cls(['Pork'])
@classmethod
def JewishDeault(cls):
return cls(['Beef'])
def __repr__(self):
return f"Menu({self.default})"
if __name__ == '__main__':
IndiaRestaurant = Menu.IndianDeault()
JewishRestaurant = Menu.JewishDeault()
print(IndiaRestaurant)
print(JewishRestaurant)
Menu(['Pork'])
Menu(['Beef'])
2.@staticmethod
– 静态方法
静态方法不能访问cls
或self
,其作用和普通函数相同,但属于类的命名空间 。在类中使用@staticmethod
标记类的静态方法。
3.实例方法
在类中比较常见的是实例方法,实例方法的self
参数指向实例本身,通过self
可修改或访问实例的属性。
4.@property
– 内置描述符
property()
函数提供一个内置的描述符类型,它知道如何将一个属性链接到一组方法上。它接受4个可选参数:fget
、fset
、fdel
、doc
,通常用@property
装饰器标识类的方法实现。
class Retangle:
def __init__(self, x1, x2, y1, y2):
self.x1, self.x2 = x1, x2
self.y1, self.y2 = y1, y2
@property
def width(self):
"""Retange's width measured from x1 to x2"""
return abs(self.x1 - self.x2)
@width.setter
def width(self, value):
"""Set Retangle's width"""
self.x2 = self.x1 + value
print("Successfully set!")
if __name__ == '__main__':
retangle = Retangle(1, 2, 3, 4)
wid = retangle.width
print(wid)
retangle.width = 3
print(retangle.width)
print(retangle.x2)
1
Successfully set!
3
4
5.私有成员的实现
python面向对象成员的权限属性由变量的命名决定。
(1)变量名加单下划线_
前缀,这是python命名规范约定的规则,Pycharm
中会有弱警告,仍然能通过.
操作符访问该变量,建议不要访问该命名方式的变量。
(2)变量名前加双下划线__
前缀,访问该变量时会出错。