zoukankan      html  css  js  c++  java
  • 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,报错

     ..

  • 相关阅读:
    Alcatraz的安装和使用
    TableView didSelectRowAtIndexPath 不执行
    iphone6 plus 为什么打印出的宽度是375
    GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
    strcmp传入nil导致崩溃
    修改工程名称
    Mac OS X 系统12个常用的文本编辑快捷键(移动、选中)
    删除配置文件解决OS X各种WiFi无法连接的顽固问题,解决MAC无法连接wif的情况 Preferences
    textViewDidChange: crashes in iOS 7
    iOS7隐藏状态栏 statusBar
  • 原文地址:https://www.cnblogs.com/Doaoao/p/10152540.html
Copyright © 2011-2022 走看看