python的类的 静态属性 类方法 静态方法

一、静态属性

静态属性说的就是数据属性

1、定义一个房间的类,求下这个房间的面积

class Room:
    def __init__(self,name,ower,width,length,heigh):
        self.Name=name
        self.Ower=ower
        self.Width=width
        self.Length=length
        self.Heigh=heigh

r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执行__init__
print(r1.__dict__)#查看下r1这个实例的属性字典
print("%s 住的%s 总面积是%s平米的地下室"  %(r1.Ower,r1.Name,r1.Width*r1.Length))#进行字符串拼接

C:\python35\python3.exe D:/pyproject/day25/静态属性.py

{‘Length‘: 2, ‘Ower‘: ‘北爷‘, ‘Name‘: ‘厕所‘, ‘Heigh‘: 20000, ‘Width‘: 2}

北爷 住的厕所 总面积是4平米的地下室

2、又来了一个人,又要求下他的房子的面积

class Room:
    def __init__(self,name,ower,width,length,heigh):
        self.Name=name
        self.Ower=ower
        self.Width=width
        self.Length=length
        self.Heigh=heigh
r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执行__init__
r2=Room("北京","喵爷",20,60,20000)
# print(r1.__dict__)#查看下r1这个实例的属性字典
print("%s 住的%s 总面积是%s平米的地下室"  %(r1.Ower,r1.Name,r1.Width*r1.Length))#进行字符串拼接
print("%s 住的%s 总面积是%s平米的地下室"  %(r2.Ower,r2.Name,r2.Width*r1.Length))

C:\python35\python3.exe D:/pyproject/day25/静态属性.py

北爷 住的厕所 总面积是4平米的地下室

喵爷 住的北京 总面积是40平米的地下室

3、我们这样做肯定是不行的。这相当于是在外面完成的这件事情,而且很麻烦,应该把这个计算面积弄成一个函数

class Room:
    def __init__(self,name,ower,width,length,heigh):
        self.Name=name
        self.Ower=ower
        self.Width=width
        self.Length=length
        self.Heigh=heigh
    def cal_area(self):
        print("%s 住的%s 总面积是%s平米的地下室" %(self.Ower, self.Name, self.Width * self.Length))
r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执行__init__
r2=Room("北京","喵爷",20,60,20000)#实例化第二个实例
r1.cal_area()#实例调用类的函数属性会自动传实例本身作为参数
r2.cal_area()#实例调用类的函数属性会自动传实例本身作为参数

C:\python35\python3.exe D:/pyproject/day25/静态属性.py

北爷 住的厕所 总面积是4平米的地下室

喵爷 住的北京 总面积是1200平米的地下室

4、property装饰器

class Room:
    def __init__(self,name,ower,width,length,heigh):
        self.Name=name
        self.Ower=ower
        self.Width=width
        self.Length=length
        self.Heigh=heigh
    @property #把一个方法变成一个数据属性
    def cal_area(self):
        print("%s 住的%s 总面积是%s平米的地下室" %(self.Ower, self.Name, self.Width * self.Length))
r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执行__init__
r2=Room("北京","喵爷",20,60,20000)
r1.cal_area#用了property这个装饰器之后,实例在调用函数属性就等于调用数据属性,不用加()就可以调用
r2.cal_area

C:\python35\python3.exe D:/pyproject/day25/静态属性.py

北爷 住的厕所 总面积是4平米的地下室

喵爷 住的北京 总面积是1200平米的地下室

5、这样还不行。因为正常的数据属性直接运行是没有返回值的

6、现在改为了直接return一个返回值,现在用起来的效果就是跟调用数据属性是一模一样的了,property这个装饰器就是把类的函数属性变为数据属性,也就是封装成了数据属性

class Room:
    def __init__(self,name,ower,width,length,heigh):
        self.Name=name
        self.Ower=ower
        self.Width=width
        self.Length=length
        self.Heigh=heigh
    @property #把一个方法变成一个数据属性
    def cal_area(self):
        # print("%s 住的%s 总面积是%s平米的地下室" %(self.Ower, self.Name, self.Width * self.Length))
        # return (self.Width * self.Length)
        return "%s 住的%s 总面积是%s平米的地下室" % (self.Ower, self.Name, self.Width * self.Length)
r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执行__init__
r2=Room("北京","喵爷",20,60,20000)
print(r1.cal_area)#用了property这个装饰器之后,实例在调用函数属性就等于调用数据属性,不用加()就可以调用
print(r2.cal_area)
print(r1.Name)#调用r1这个实例的数据属性
print(r2.Name)#调用r2这个实例的数据属性

C:\python35\python3.exe D:/pyproject/day25/静态属性.py

北爷 住的厕所 总面积是4平米的地下室

喵爷 住的北京 总面积是1200平米的地下室

厕所

北京

7、算是完美了,我们在增加一个计算体积的,当做是练习一下

class Room:
    def __init__(self,name,ower,width,length,heigh):
        self.Name=name
        self.Ower=ower
        self.Width=width
        self.Length=length
        self.Heigh=heigh
    @property #把一个方法变成一个数据属性
    def cal_area(self):
        # print("%s 住的%s 总面积是%s平米的地下室" %(self.Ower, self.Name, self.Width * self.Length))
        # return (self.Width * self.Length)
        return "%s 住的%s 总面积是%s平米的地下室" % (self.Ower, self.Name, self.Width * self.Length)
    @property
    def cal_tiji(self):
        return "%s 住的%s 总体积是%s平米的地下室" % (self.Ower, self.Name, self.Width * self.Length * self.Heigh)
r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执行__init__
r2=Room("北京","喵爷",20,60,20000)
r3=Room("西安","修电脑",20,60,20000)
print(r1.cal_area)#用了property这个装饰器之后,实例在调用函数属性就等于调用数据属性,不用加()就可以调用
print(r2.cal_area)
print(r3.cal_tiji)

C:\python35\python3.exe D:/pyproject/day25/静态属性.py

北爷 住的厕所 总面积是4平米的地下室

喵爷 住的北京 总面积是1200平米的地下室

修电脑 住的西安 总体积是24000000平米的地下室

二、类方法

1、类是怎么调用自己的数据属性呢

class Room:
    tag=1#定义一个类的数据属性
    def __init__(self,name,ower,width,length,heigh):
        self.Name=name
        self.Ower=ower
        self.Width=width
        self.Length=length
        self.Heigh=heigh
    @property #把一个方法变成一个数据属性
    def cal_area(self):
        return "%s 住的%s 总面积是%s平米的地下室" % (self.Ower, self.Name, self.Width * self.Length)
    @property
    def cal_tiji(self):
        return "%s 住的%s 总体积是%s平米的地下室" % (self.Ower, self.Name, self.Width * self.Length * self.Heigh)
print(Room.tag)

C:\python35\python3.exe D:/pyproject/day25/静态属性.py

1

2、由于self把类和实例绑定到一起了,所以我们的折中方案就是先生成一个实例,然后在用类去调用方法,把实例手动穿进去

class Room:
    tag=1#定义一个类的数据属性
    def __init__(self,name,ower,width,length,heigh):
        self.Name=name
        self.Ower=ower
        self.Width=width
        self.Length=length
        self.Heigh=heigh
    def tell_info(self):
        print("---->",self.tag)
r1 = Room("厕所", "北爷", 2, 2, 20000)
Room.tell_info(r1)#类调用类的函数属性的时候需要手动传实例本身

C:\python35\python3.exe D:/pyproject/day25/静态属性.py

1

----> 1

3、但是我如果只想执行类的方法,不想跟任何实例有捆绑,该怎么做呢,python给我们提供了classmethod这个装饰器,只要用了这个方法, 就表示这个装饰器下面的方法是专门给类用的

这个方法就是只是类在调用类的方法,跟实例没关系,只要加了classmethod就只能供类调用

class Room:
    tag=1#定义一个类的数据属性
    def __init__(self,name,ower,width,length,heigh):
        self.Name=name
        self.Ower=ower
        self.Width=width
        self.Length=length
        self.Heigh=heigh
    @classmethod#这个装饰器是专门供类使用的方法
    def tell_info(cls):#cls代表类本身
        print(cls)
        print("---",cls.tag)#等价于Room.tag
Room.tell_info()#会自动把类本身传给cls

C:\python35\python3.exe D:/pyproject/day25/静态属性.py

<class ‘__main__.Room‘>

--- 1

三、静态方法 叫类的工具包,不跟类绑定也不跟实例绑定

class Room:
    tag=1#定义一个类的数据属性
    def __init__(self,name,ower,width,length,heigh):
        self.Name=name
        self.Ower=ower
        self.Width=width
        self.Length=length
        self.Heigh=heigh
    @classmethod#这个装饰器是专门供类使用的方法
    def tell_info(cls):#cls代表类本身
        print(cls)
        print("---",cls.tag)
    @staticmethod#静态方法  叫类的工具包,不跟类绑定也不跟实例绑定
    def wash_body(a,b,c):
        print("%s %s %s 正在洗澡" %(a,b,c))
Room.wash_body("北爷","喵爷","修电脑")#用类调用washbody这个方法
r1=Room("厕所","北爷",2,2,20000)#实例化一个实例r1
r1.wash_body("北爷","喵爷","修电脑")#用实例调用washbody这个方法

C:\python35\python3.exe D:/pyproject/day25/静态方法.py

北爷 喵爷 修电脑 正在洗澡

北爷 喵爷 修电脑 正在洗澡

查看下 这个静态方法是不是存到了类的属性字典里面

class Room:
    tag=1#定义一个类的数据属性
    def __init__(self,name,ower,width,length,heigh):
        self.Name=name
        self.Ower=ower
        self.Width=width
        self.Length=length
        self.Heigh=heigh
    @classmethod#这个装饰器是专门供类使用的方法
    def tell_info(cls):#cls代表类本身
        print(cls)
        print("---",cls.tag)
    @staticmethod#静态方法  叫类的工具包,不跟类绑定也不跟实例绑定
    def wash_body(a,b,c):
        print("%s %s %s 正在洗澡" %(a,b,c))
Room.wash_body("北爷","喵爷","修电脑")#用类调用washbody这个方法
print(Room.__dict__)#查看下静态方法   结果是定义到了类的属性字典里面了

总结:

静态属性:property类和实例都可以访问静态属性

(把函数封装成一个数据属性,让外面的人感受不  到是调用的函数属性)

类方法:  classmethod只能类访问类方法,不能用实例访问类方法

静态方法:staticmethod 用类可以调用静态方法,实例也可以调用静态方法

不跟类和实例绑定,只叫类的工具包

原文地址:https://www.cnblogs.com/gouguoqilinux/p/9194093.html

时间: 2024-08-16 06:13:16

python的类的 静态属性 类方法 静态方法的相关文章

JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链 JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法 1.Object类 在JS中,Object是所有类的基

类和对象:静态属性、静态方法

在PHP中,使用关键字 static 修饰成员属性和成员方法被称为静态属性和静态方法.静态属性和静态方法不需要在类被实例化的情况下可以直接使用. 静态属性 与普通的成员属性不同,静态属性属于类本身而不属于类的任何实例.静态属性可以被看做是存储在类当中的全局变量,可以在任何地方通过类来访问它们. 由于静态属性不受任何具体对象的限制,所以不需要建立类实例,而可以直接引用类中的静态属性,使用语法格式如下: 类名称::$静态属性名称 其中,符号”::”被称作范围解析操作符,它可以用于访问静态成员.静态方

Class的使用,构造方法,实例属性和实例方法,静态属性和静态方法,this和super关键字,类的继承

s6新增了一种定义对象实例的方法,Class(类)这个概念,作为对象的模板.class可以看作只是一个语法糖,通过class关键字,可以定义类.让对象原型的写法更加清晰.更像面向对象编程的语法. 一.  Class的基本用法 1.  constructor方法 1 //定义类 2 class Point { 3 constructor(x, y) { 4 this.x = x; 5 this.y = y; 6 } 7 8 toString() { 9 return '(' + this.x +

PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

  前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象类与抽象方法 1.什么是抽象方法?              没有方法体 {} 的方法,必须使用abstract 关键字修饰.这样的方,我们叫做抽象方法.                    abstract function say(); //    抽象方法 2.什么是抽象类?        

php静态属性和静态方法学习笔记

在属性和方法前加static修饰可以成为静态属性和静态方法. 静态属性的访问用 类来访问  例如  human::$head 1.类生成完毕,静态属性就已经存在,不需要依赖对象来访问 2.类在内存中只有一个,因此静态属性也只有一个. 普通方法,存放于类内,只有一份 静态方法,也是存放于类内,只有一份. 区别在于,普通方法需要用队形去调动,需要绑定$this,必须要有对象,用对象调动. 而静态方法,不属于哪个对象,属于类,因此不需要用$this去绑定,同过类名就可以调用.

php静态属性和静态方法

php静态属性和静态方法 2012-09-29 10:18 1518人阅读 评论(0) 收藏 举报 phpfunction 本php教程主要是学习php中静态属性和静态方法的使用方法和基本的示例. ·                                 静态属性 静态属性也就是说它的值保持其值,比如在类中实例化了N个对象,那么你可以在构造函数中定义一个静态属性来记住对象的个数.类中的静态属性和静态变量差不多,只不过在类中似乎又多了一个些使用上的限制罢了.让我们看看一般的变量吧: <?

c++第七章-(静态属性和静态方法)

1.静态属性和静态方法 静态方法的调用,ClassName::mothodName(); class Pet { public: Pet(std::string theName); ~Pet(); static int getCount();//公开的静态方法 protected: std::string name; private: static int count;//私有的静态变量 }; class Dog:public Pet { public: Dog(std::string theN

Java静态属性、静态方法、非静态属性、非静态方法的继承问题简单了解

package com.book.web.controller; /**  * 父类  * @author liweihan  *  */ public class Parent { public String normalStr = "父类非静态属性"; public static String staticStr = "父类静态属性"; public String changeStr = "父类-变量"; public static Stri

php之静态属性与静态方法

静态属性用法:static public $var = 1; 从内存角度看,静态属性存放在类内,普通属性存放在对象中,类声明完毕,静态属性就存在,因为类在内存中只有一个,静态也只有一个. 普通属性存放在对象中,用对象->$var来访问,静态属性存放在类内,不依赖对象,没有对象也能访问,用类名::$var来访问,静态属性只有一个,为所有对象共享. 静态方法用法:static public function t(){} 普通方法存放在类内,只有一份,静态方法也存放在类内,也只有一份.区别在于,普通方