python是动态语言的表现以及属性方法操作

本文深入探讨了Python作为一门动态语言的特点,包括如何动态地为对象和类添加、删除属性及方法,介绍了使用slots限制动态添加属性的方法,并详细解析了Python中私有属性的访问方式以及property装饰器的应用。

Python是一门动态语言,本文主要从python中属性方法的添加,删除,property的使用等方面进行介绍。

Python是动态语言,是因为Python定义类后,可以动态的更改类的内部结构。

 

1.对象属性的添加,类属性的添加,对象方法的添加,类方法的添加,静态方法的添加等以及删除。

  说明:添加对象方法建议使用第二种,因为第一种不符     合常规调用对象方法的习惯。

class Foo(object):
    pass


obj = Foo()

# 添加对象属性
obj.a = 10
# print(obj.a)

# 添加类属性
Foo.b = 20


# print(Foo.b)
# print(obj.b)

# 添加对象方法

def obj_fun(self):
    print(self.a)


# 第一方法,通过类名追加对象方法, 所有这个类的对象都能调用这个对象方法

Foo.o_fun = obj_fun

# obj.o_fun()

# 第二方法,通过对象名追加对象方法,只有这个对象能够使用

# obj.o2_fun = obj_fun
#
# obj.o2_fun(obj)

import types

# 使用MethodType函数将obj与obj_fun的参数self绑定
obj.obj_fun = types.MethodType(obj_fun, obj)


# obj.obj_fun()

# 添加类方法

@classmethod
def class_fun(cls):
    print(cls.b)


Foo.class_fun = class_fun


# Foo.class_fun()

# 添加静态方法

@staticmethod
def static_fun():
    print("static_fun called")


Foo.static_fun = static_fun

# Foo.static_fun()



# 删除属性方法

# 对象属性
# del obj.a
delattr(obj, "a")

# print(obj.a)

# 类属性
del Foo.b
# print(Foo.b)

# 对象方法
del Foo.obj_fun
# obj.obj_fun()
# 类方法
del Foo.class_fun
# 静态方法
del Foo.static_fun

2.使用slots属性限制动态添加特性。说明:slots只会限制对象动态的添加,而不会限制类进行动态的添加,目前,限制类动态添加的方法暂时没有。

# 类通过定义一个__slots__属性来限制对象动态添加属性和方法
# 不能限制通过类的方式添加属性和方法


class Foo(object):
    __slots__ = ["name", "age"]  # 定义限制对象添加的列表


f = Foo()
f.name = "ling"
print(f.name)  # ling
f.age = 21
print(f.age)  # 21

# f.sex = "nv"
# print(f.sex)  # 报错
#     f.sex = "nv"
# AttributeError: 'Foo' object has no attribute 'sex'

Foo.sex = "nv"  # 类属性
print(f.sex)


def c(self):
    print(self.name)


# import types
#
# f.c = types.MethodType(c, f)
# f.c()  #报错
#     f.c = types.MethodType(c, f)
# AttributeError: 'Foo' object has no attribute 'c'
Foo.c = c

f.c()
# ling
# 21
# nv
# ling

3.访问私有属性。说明:python非常灵活,给你提供私有的特性,又在极特殊情况下可以使用。即通过名字重整的情况。

class Foo(object):
    def __init__(self):
        self.__name = "xiaoming"  # 名字重整,Python解释器默认把私有属性改为_类名 即  _Foo__a


class SonFoo(Foo):
    def print_name(self):
        print(self._Foo__name)




obj = Foo()
# print(obj.__name)
# print(obj._Foo__name)

sf = SonFoo()
sf.print_name()  # 小明

4.通过方法调用来获得私有属性。说明:使用property装饰器的时候,它只装饰get方法,必须有。

# 通过set和get方法
class Bank(object):
    def __init__(self):
        self.__money = 1000

    def get_money(self):
        return self.__money

    def set_money(self, money):
        if isinstance(money, int):
            self.__money = money
        else:
            raise Exception("数据类型有误")


b = Bank()
print(b.get_money())
b.set_money(666)
print(b.get_money())


# 通过property函数
class Bank(object):
    def __init__(self):
        self.__money = 1000

    def get_money(self):
        return self.__money

    def set_money(self, money):
        if isinstance(money, int):
            self.__money = money
        else:
            raise Exception("数据类型有误")

    money = property(get_money, set_money)


b = Bank()
print(b.money)
b.money = 666
print(b.money)


# 通过property装饰器
class Bank(object):
    def __init__(self):
        self.__money = 1000

    @property
    def money(self):
        return self.__money

    @money.setter
    def money(self, money):
        if isinstance(money, int):
            self.__money = money
        else:
            raise Exception("数据类型有误")


b = Bank()
print(b.money)
b.money = 666
print(b.money)


# 只读
class Bank(object):
    def __init__(self):
        self.__money = 1000

    @property
    def money(self):
        return self.__money


b = Bank()
print(b.money)
b.money = 666
print(b.money)


# 只写 必须有读属性
class Bank(object):
    def __init__(self):
        self.__money = 1000

    @property
    def money(self):
        raise AttributeError("不支持属性读取")

    @money.setter
    def money(self, money):
        if isinstance(money, int):
            self.__money = money
        else:
            raise Exception("数据类型有误")


b = Bank()
print(b.money)
b.money = 666
print(b.money)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值