# -----------------------
# __Author : tyran
# __Date : 17-11-9
# -----------------------
"""
Python 类 类方法 静态方法 类属性
"""
class Base:
# 静态成员变量(其实我忘了Python里是不是叫这个名字),这个变量是属于类的,所有的类对象共享(如果有好几个对象,大家用的是同一个)
# 第二点,静态变量在成员内部是不能直接通过self调用的,Base.static_member和self.static_member可不是同一个变量
# 第三点,不要把普通的成员变量和静态变量搞成一个名字,这里面会有问题,因为Python的高度自由的语法(我觉得这个是因为c)使用的时候会有点误区
static_member = 'I am Static Member'
# 构造方法 ----------->self其实就是指的对象
def __init__(self, name, age):
print('This is Base __init__')
self.name = name
self.age = age
# 普通方法(公有方法) --------->需要先创建类对象,才能在外部使用
def public_func1(self):
print(self.name, self.age)
# 静态方法 ------>不需要创建类对象,直接可以通过类去调用
@staticmethod
def static_func1(): # 他不需要self
print('This is Static Method')
# 类方法 ------>不需要创建类对象,直接可以通过类去调用,同样因为cls是类名,所以他可以调用静态变量哦
@classmethod
def class_func1(cls): # cls == class,函数传入的其实是一个类名,通过类去调用的时候会将该类自动填充这个cls
print('This is Class Method')
print(cls.static_member)
# 静态方法调用
Base.static_func1()
# 类方法调用
Base.class_func1()
# 普通方法调用
base = Base('aaa', 21)
base.public_func1()
# --------总结1------------
"""
乍一看,静态方法和类方法差不多么,如果差不多为什么会有两种?
其实关键就在于cls。我们发现静态方法和类方法是没有self传入的,类方法会把cls传入方法,在方法内就可以调用cls的成员,
注意是类成员,也就是静态变量,和函数。
那有朋友说了,我给静态方法加一个形参,然后通过形参进行内部调用不可以么?当然可以,但是请注意,用户传什么可是不可控的,
等于需要在内部再做容错机制,这就比较麻烦了。
"""
# 类属性
class Base1:
def __init__(self, name, age):
print('This is Base1 __init__')
self.name = name
self.age = age
self.money = 999
# 这里开始就是属性创建,作用么。。。。其实我也没看出来有啥作用,先理解为,对于内部私有变量访问和设置吧
# 其实没有什么新的内容,对比看一下应该就能理解了
@property
def func1(self):
print('name : ' + self.name
+ ' age : ' + str(self.age)
+ ' money : ' + str(self.money))
return 666
@func1.setter
def func1(self, add_money):
self.money += add_money
print('{0} 发财啦! {0} has ${1}'.format(self.name, self.money))
@func1.deleter
def func1(self):
self.money = 0
print('{0} 破产了! 他还剩余${1}'.format(self.name, self.money))
# -------------------第二种写法
def func2_getting(self):
print('name : ' + self.name
+ ' age : ' + str(self.age)
+ ' money : ' + str(self.money))
return 666
def func2_setting(self, add_money):
self.money += add_money
print('{0} 发财啦! {0} has ${1}'.format(self.name, self.money))
def func2_delete(self):
self.money = 0
print('{0} 破产了! 他还剩余${1}'.format(self.name, self.money))
func2_property = property(fget=func2_getting, fset=func2_setting, fdel=func2_delete)
base1 = Base1('tom', 18)
print(base1.func1) # 调用@property标注的函数,记得不能加()
base1.func1 = 1 # 调用@func1.setter标注的函数,函数参数就是等号右边的部分,这里有个问题就是参数只能是一个,我还没看到什么办法添加两
del base1.func1 # 调用@func1.deleter标注的函数
# 调用方法可以看下,一样的。。。
print(base1.func2_property)
base1.func2_property = 1
del base1.func2_property
Python 3.6 类属性
最新推荐文章于 2021-02-03 06:27:02 发布