Python_基础_(静态属性,组合)

一,@property的使用

 当在类中添加一个属性时,如果将属性直接暴露在外,让对象可以随意的调用,这就会让属性可以随意的更改

# property用法一

## 实例化出的对象可以随意的获取和修改 name

class Dog:
    def __init__(self,name):
        self.name = name

d =Dog("藏獒")
print(d.name)           # 藏獒

d.name = "中华田园犬"
print(d.name)           # 中华田园犬

## 在类中添加方法 get_name()来获取名字,添加set_name()来写入名字(现在就不能随心所欲设置名字了)

class Dog:
    def set_name(self,name):
        if len(name) > 10:
            print("名字的长度超过10个字符")
        else:
            self.name = name
    def get_name(self):
        return self.name

d = Dog()
d.set_name("中华田园犬")
print(d.get_name())         # 中华田园犬

d1 = Dog()
d1.set_name("我是超级可爱的中华田园犬")     # 名字的长度超过10个字符

## @property的作用就是负责将一个方法变成一个属性调用

class Dog:
    def __init__(self,val):
        self.__NAME = val   # 将数据隐藏起来

    @property
    def name(self):
        return self.__NAME  # obj.name访问的是self.__NAME

    @name.setter
    def name(self,value):
        if len(value) > 10:
            raise TypeError('名字的长度超过10个字符')
        self.__NAME = value


d = Dog("中华田园犬")
d.name = "藏獒"       # 实际转化为 set_name("藏獒")
print(d.name)         # 实际转化为 get_name

## 可以自定义只读属性,只定以getter方法

# 由getter方法和setter方法,为可读可写
class Dog:
    def __init__(self,val):
        self.__NAME = val
        
    @property
    def name(self):
        return self.__NAME
    
    @name.setter
    def name(self,value):
        self.__NAME = value
# 只有getter方法,为只读
class Cat:
    def __init__(self,val):
        self.__NAME = val 
        
    @property
    def name(self):
        return self.__NAME

## 小总结

class Test:
    @property
    def Foo(self):
        print("当get是运行该方法")

    @Foo.setter
    def Foo(self,value):
        print("当set是运行该方法")

    @Foo.deleter
    def Foo(self):
        print("当delete是运行该方法")

t = Test()
t.Foo           # 当get是运行该方法
t.Foo = "abc"   # 当set是运行该方法
del t.Foo       # 当delete是运行该方法

# property用法二

class Test:
    def get_Foo(self):
        print("当get是运行该方法")

    def set_Foo(self,value):
        print("当set是运行该方法")

    def delete_Foo(self):
        print("当delete是运行该方法")
    Test_P = property(get_Foo,set_Foo,delete_Foo)
t = Test()
t.Test_P           # 当get是运行该方法
t.Test_P = "abc"   # 当set是运行该方法
del t.Test_P       # 当delete是运行该方法

# property使用

class Fraction:
    def __init__(self):
        self.EndTerm = 100      # 平时分
        self.Peacetime = 100    # 总分

    # 获得总分
    @property
    def fra(self):
        return self.EndTerm + self.Peacetime

    # 修改平时分
    @fra.setter
    def fra(self,value):
        self.Peacetime = value

    # 删除平时分
    @fra.deleter
    def fra(self):
        del self.Peacetime

f = Fraction()
print(f.fra)    # 200
f.fra = 90      # 修改平时成绩
print(f.fra)    # 190
del f.fra       # 删除平时成绩
f.fra           # 再次调用时则报错
使用1

...

 二,classmethod

## 注:普通的方式,当想要执行类中的方法时,必须传入一个实例化出来的对象

class Room:
    def __init__(self, name, owner, width, height):
        self.name = name
        self.owner = owner
        self.width = width
        self.height = height

    def cal_area(self):
        print("我是类中的一个方法")

r1 = Room("酒店", "henry", 100, 100)
Room.cal_area(r1)

Room.cal_area()     # 不传入对象则会报错 TypeError: cal_area() missing 1 required positional argument: 'self' 

## 定义一个供类使用的方法

# 使用@classmethod

# 用于需求:当类调用自己的方法,但与实例无关时

class Room:
    def __init__(self, name, owner, width, height):
        self.name = name
        self.owner = owner
        self.width = width
        self.height = height

    @classmethod
    def cal_area(cls):
        print("我是类中的一个方法")

Room.cal_area()    # 我是类中的一个方法
# 可直接调用类中的方法,而无需传入参数(实例化)

...

三,staticmethod

 # 静态方法

# 1:@staticmethod 类的工具包,不和类绑定也不和具体的实例绑定

# 2:不能使用类变量和实例变量,只是类的工具包

# 3:声明静态方法,类可以不用实例化就能调用改方法,也可以实例化后调用该方法

class Room:
    def __init__(self, name, owner, width, height):
        self.name = name
        self.owner = owner
        self.width = width
        self.height = height

    @staticmethod
    def cal_area(a, b, c):
        print(a)

    def cal_value(x):  # 类一个普通的函数,毫无意义,与上方静态方法的区别
        pass

Room.cal_area(10, 20, 30)            # 静态方法可以被类直接调用
Room.cal_value(10)                   # 类可以调用cal_value
r1 = Room("酒店", "henry", 100, 100)
r1.cal_area(10, 20, 30)              # 也能调用,不与实例绑定
r1.cal_value(10)                     # 但实例的参数无法调用cal_value,报错

 ..

原文地址:https://www.cnblogs.com/Doaoao/p/10152540.html