python之property、类方法和静态方法

一、完整的property
1、定义
一个方法被伪装成属性之后,应该可以执行一个属性的增删改查操作,
增加和修改就对应着被setter装饰的方法,
删除一个属性对应着被deleter装饰的方法。

@property:把方法伪装成属性

@被property装饰的方法名.setter:
当被property装饰的方法,又实现了一个同名方法,且被setter装饰器装饰了,
那么在对被装饰的方法赋值的时候,就会触发被setter装饰器装饰的方法,
这个方法必须要传一个参数接收等号后面的值,
是用来保护一个变量在修改的时候能够添加一些保护条件。

@被property装饰的方法名.deleter:
当被property装饰的方法,又实现了一个同名方法,且被deleter装饰器装饰了,
那么在对被装饰的方法进行删除的操作时,就会触发被deleter装饰器装饰的方法,
这个方法并不能在执行的时候真的删除这个属性,而是你在代码中执行什么就有什么效果.

2、例题

学生类
class Student:
    def __init__(self,name):
        self.__name = name

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self,new):
        if type(new) is str:   #因为名字是字符串类型的,我们这样设置可以保证只能用字符串修改名字
            self.__name = new

    @name.deleter
    def name(self):
        del self.__name

xiaoming = Student(‘小明‘)
print(xiaoming.name)   #小明

xiaoming.name = 123   # 不是字符串修改不了
print(xiaoming.name)   # 小明

xiaoming.name = ‘小花猫‘
print(xiaoming.name)   # 小花猫

del xiaoming.name
print(xiaoming.__dict__) # {} 空字典

水果类:
class Fruits:
    __discount = 0.7

    def __init__(self,price):
        self.__price = price

    @property
    def price(self):
        return self.__price * Fruits.__discount

    @price.setter
    def price(self,new):
        if type(new) is int or float:
            self.__price = new

    @price.deleter
    def price(self):
        del self.__price

banana = Fruits(10)
print(banana.price)  # 折扣价7.0

banana.price = 9
print(banana.price) # 折扣价6.3

del banana.price
print(banana.__dict__)  # {} 空字典

3、总结:
被setter和deleter装饰的方法名必须和被property装饰的方法名一致,对象.方法名 不加括号 可以调用被property装饰的方法,
当对被property装饰的方法赋值时,就会触发被setter装饰的方法,当对被property装饰的方法进行删除del操作时,就会触发
被deleter装饰的方法。
注意:(一般来说用的最多的是property,其他两个看情况而使用)

二、类方法:
用@classmethod装饰
通过类名调用
类方法默认形参用cls表示,而不用self
可以直接通过类去修改类的属性,不需要实例化

class Fruits:
    __discount = 0.7  # 类的静态属性

    def __init__(self,price):
        self.__price = price  # 对象的私有属性

    @property
    def price(self):
        return self.__price * Fruits.__discount

    @classmethod
    def change_discount(cls,new):  # 类方法默认形参用cls表示,而不用self
        cls.__discount = new

Fruits.change_discount(0.6)
print(Fruits.__dict__)  # ‘_Fruits__discount‘: 0.6

类方法的特点:
只使用类中的资源,且这个资源可以直接用类名引用,那这个方法应该被改为一个类方法

三、静态方法
被@staticmethod装饰的方法,不使用类中的命名空间也不使用对象的命名空间,
可以传参,也可以不传参,没有默认参数(self,cls),相当于一个类外的普通的方法,
不同的是调用的时候需要 类名.方法名

class Student:
    @staticmethod
    def login():
        print(‘登录成功‘)

Student.login())

四、类中的方法属性总结
类:  成员:       标准使用者:       默认形参:
    静态属性      类/对象                     
    类方法       类         cls 表示类
    静态方法      类
    方法        对象        self 表示对象
    property方法    对象        self 表示对象

 注意:有些成员用类和对象都是可以调用的,不过建议按照标准使用者去调用。

五、
1、isinstance:判断一个对象是否是一个已知的类型
print(type(123) is int)           # True
print(isinstance(123,int))     # True

# isinstance还可以检测对象与类之间的关系(包括继承)
# type不能检测继承关系

class A:
    pass
class B(A):
    pass
a = A()
b = B()

print(type(a) is A) # True
print(type(b) is B) # True
print(type(b) is A) # False

print(isinstance(a,A)) # True
print(isinstance(b,B)) # True

# 子类是父类的类型,但是父类不是子类的类型
print(isinstance(b,A)) # True
print(isinstance(a,B)) # False

2、issubclass:检测类与类之间的关系
用法:issubclass(子类,父类)

class A:
    pass
class B(A):
    pass
print(issubclass(A,B))  # False
print(issubclass(B,A))  # True

原文地址:https://www.cnblogs.com/Zzbj/p/9562621.html

时间: 2024-08-11 15:13:26

python之property、类方法和静态方法的相关文章

python类:类方法和静态方法

http://blog.csdn.net/pipisorry/article/details/49516185 面相对象程序设计中,类方法和静态方法是经常用到的两个术语.逻辑上讲:类方法是只能由类名调用:静态方法可以由类名或对象名进行调用.在C++中,静态方法与类方法逻辑上是等价的,只有一个概念,不会混淆.在python中,方法分为三类实例方法.类方法.静态方法. @classmethod和@staticmethod 他们的使用场景并不一样.在python中,两种方法的主要区别在于参数 类内部普

python 实例方法,类方法和静态方法

在学习python代码时,看到有的类的方法中第一参数是cls,有的是self,经过了解得知,python并没有对类中方法的第一个参数名字做限制,可以是self,也可以是cls,不过根据人们的惯用用法,self一般是在实例方法中使用,而cls则一般在类方法中使用,在静态方法中则不需要使用一个默认参数.在下面的代码中,InstanceMethod类的方法中,第一个参数是默认的self,在这里可以把self换成任何名字来表示,不会有任何影响.在类调用的时候,需要满足参数的个数要求(参数中含有*args

Python 实例方法、类方法、静态方法的区别与作用

Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调用的呢?它们又有何区别和作用呢? 首先,这三种方法都定义在类中.下面先简单说一下怎么定义和调用的. 实例方法 定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法): 调用:只能由实例对象调用. 类方法 定义:使用装饰器@classmethod.第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能

python的实例方法,类方法和静态方法区别

class foo(object):    def test(self):#这是实例方法        print('object')    @classmethod#这是类方法    def test2(clss):        print('class')    @staticmethod#这是静态方法    def test3():        print('static') #实例方法的访问方式ff=foo()ff.test()#实例方法可以通过实例化类然后实例来调用foo.test

python中的类方法、静态方法、对象方法

注:以下都是以公有为前提,私有方法只能在类内部调用,不需多讲. 1.对象方法 这种方法都有一个默认参数:self  这代表实例的这个对象 def __init__(self): print("初始化对象") 类是不能直接调用对象方法: class User(object): name = 'zs' def __init__(self): print("初始化对象") User.__init__() 这样调用抛出一个错误:TypeError: __init__() m

python类方法和静态方法

C++的静态方法是用static关键字,python j是没用static的. python中实现静态方法和类方法都是依赖于python的修饰器来实现的. class MyClass: def  method(self): print("method") @staticmethod def  staticMethod(): print("static method") @classmethod def classMethod(cls): print("cl

Python学习手册之数据封装、类方法和静态方法

在上一篇文章中,我们介绍了 Python 的内部方法.操作符重载和对象生命周期,现在我们介绍 Python 的数据封装.类方法和静态方法.查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/10017357.html 数据封装面向对象编程的一个关键部分是封装,它涉及将相关变量和函数打包到一个简单易用的对象(类的一个实例)中.一个相关的概念是隐藏数据,它隐藏了类的实现细节,并提供一个干净的标准接口.在其它编程语言中,通常是通过私有方法和属性完成的,这些方法和属

Python之路-面向对象&继承和多态&类属性和实例属性&类方法和静态方法

一.面向对象 编程方式 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强-" 什么是面向对象 面向对象就不像面向过程那样按照功能划分模块了,它所关注的是软件系统有哪些参与者,把这些参与者称为对象,找出这些软件系统的参与者也就是对象之后,分析这些对象有哪些特征.哪些行为,以及对象之间的关系,所以说面向对象的开发核心是对象 什么是类 面向对象编程的两个重要的概念:类和对象 类是

python中实例方法,类方法,静态方法的区别

Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调用的呢?它们又有何区别和作用呢?且看下文. 首先,这三种方法都定义在类中.下面我先简单说一下怎么定义和调用的.(PS:实例对象的权限最大.) 实例方法 定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法): 调用:只能由实例对象调用. 类方法 定义:使用装饰器@classmethod.第一个参数必须是当前类对象,该参数名一般约定为“

python 类方法与静态方法

@classmethod : 类方法 @staticmethod : 静态方法 类方法和静态方法的调用一样,都是通过类就可以直接调用(类名.方法名()). 区别: 类方法,需要传入该类,定义类方法的时候要传一个默认的参数cls.是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法.类方法的第一个参数cls, 静态方法则不用.第一个参数是self,表示该类的一个实例. 原文地址:https://www.cnblogs.com/tingxin/p/12216022.htm