Python 3.6 类属性

# -----------------------
# __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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值