python学习第七周之静态方法、类方法、属性方法和一些类的成员方法

1、静态方法:只是名义上归类来管理,实际上在静态方法访问不了类或实例中的任何属性。

(1)我们先看以下代码,实例化一个对象后,d可以直接调用talk()

class Dog(object):
    def __init__(self,name):
        self.name=name
    def talk(self):
        print("%s is talking" % self.name)
d=Dog("chen")
d.talk()

(2)而我们在使用静态方法后,实例化后直接调用的话d.eat()会报错,因为在静态方法中,实例化的name是传递不进去eat函数中的;

class Dog(object):
    def __init__(self,name):
        self.name=name
    @staticmethod   #静态方法实际跟类没有关系,但是必须通过类名去调用;调用不了类的变量跟实例变量,相当于只是类的一个函数
    def eat(self):  #在实例化后是传不进来的,如果想要传进来,那么需要将d传进来
        print("%s is eating %s" %(self.name,‘包子‘))
d=Dog("chen")
d.eat()  #报错eat() missing 1 required positional argument: ‘self‘,实例化后的self传不进去

所以我们这时候如果要访问eat()方法,则需要将实例传递给改函数,即

d.eat(d)

这样便可以将实例化对象d的name “chen”传递给eat函数。

2.类方法

类方法:只能访问类变量,不能访问实例变量。

如以下程序,我们将eat()方法定义为类方法,这时发现在实例化对象后,调用eat方法后报错,这时在构造函数中添加变量 self.n  = 333,执行仍然报错,说明类方法,不能访问实例变量

class Dog(object):
    def __init__(self,name):
        self.name=name
        self.n  = 333
    @classmethod     #类方法,只能访问类变量,不能访问实例变量
    def eat(self):  #在实例化后是传不进来的,如果想要传进来,那么需要将d传进来
        print("%s is eating %s" %(self.name,‘包子‘))
        print("%s is eat %s" %(self.n,‘包子‘))
d=Dog("chen")
d.eat()

而我们在Dod类中添加两个类变量,这时再执行程序:

class Dog(object):
    n=333
    name="hhh"
    def __init__(self,name):
        pass

由上可知,类方法只能访问类变量

3.属性方法

属性方法:把一个方法变成一个静态属性,

(1)如以下程序:

class Dog(object):
    def __init__(self,name):
        self.name=name
    @property  #attribute
    def eat(self):
        print("%s is eating %s" %(self.name,‘包子‘))
d=Dog("chen")
#d.eat()  #这样调用时报错,应该d.eat
d.eat   # 属性方法:把一个方法变成一个静态属性

此时,eat方法为静态属性,所以d.eat()调用时会报错,我们需要这样来调用:d.eat

(2)A 这时eat是一个属性,没有办法通过括号来传递参数,这时如果要给eat传递参数,要写一个相同的eat函数,这时传递参数时便可以传递进来;

  @eat.setter
    def eat(self, food):
        print("set to food:", food)
d=Dog("chen")
d.eat   # 属性方法:把一个方法变成一个静态属性
d.eat="baozi"   #如果要传递参数,必须在写一个相同的函数,@eat.setter

以上程序输出结果如下: 这时看到baozi被传递进来

chen is eating 包子
set to food: baozi    

  B 将以上给eat的赋值存储下来,在打印的时候发现输出结果发生变化:

class Dog(object):
    def __init__(self,name):
        self.name=name
        self.__food=None
    @property  #attribute
    def eat(self):
        print("%s is eating %s" % (self.name, self.__food))
    @eat.setter
    def eat(self, food):
        print("set to food:", food)
        self.__food=food
d=Dog("chen")
d.eat   # 属性方法:把一个方法变成一个静态属性
d.eat="baozi"   #如果要传递参数,必须在写一个相同的函数,@eat.setter
d.eat

将传递给eat的参数“baozi”存下来:结果如下

chen is eating None
set to food: baozi
chen is eating baozi

(3)删除属性:再写一个相同的函数,删除;这时在调用d.eat报错

@eat.deleter
    def eat(self):
        del self.__food
        print("删除完成")del d.eat d.eat #删除私有属性后,再次调用时报错

4.类的特殊成员方法:(以3的程序为例)

(1)__call__() 方法

__call__对象后面加括号,触发执行。

构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

将d实例化d=Dog("chen")后,再直接d()报错,这时我们在类Dog中写一个__call__()方法,

class Dog(object):

        def __call__(self, *args, **kwargs):
        print("running call",args,kwargs)
d=Dog("chen")
d()     #d=Dog("chen") d(),与Dog("chen")()一样
d(1,2,3,name=333)

这时看到输出结果为:

running call () {}
running call (1, 2, 3) {‘name‘: 333}

(2)__dict__()方法

  没有实例化对象时,将类的方法以字典的形式打印出来,但是不包括实例的属性

#__dict__方法
print(Dog.__dict__)   #没有实例化对象以字典的形式将类的方法打印出来,不包括实例属性

 实例化对象后,打印对象的实例属性:

d=Dog("chen")
print(d.__dict__)    #通过实例调用,只打印了所有的实例变量输出结果如下:{‘name‘: ‘chen‘, ‘_Dog__food‘: None}

(3)__str__方法:

  如果我们直接实例化后打印,没有写str方法的话,输出的为内存地址

d=Dog("chen")
print(d)  #如果没有str方法,打印输出为<__main__.Dog object at 0x01104B70>;如果写入str方法,在打印对象时,默认输出该方法的返回值

  如果我们在类Dog中写入str方法,在实例化后打印,输出结果为该方法的返回值

    def __str__(self):
        return "<obj:%s>"%self.named=Dog("chen")print(d)  #如果写入str方法,在打印对象时,默认输出该方法的返回值:<obj:chen>

原文地址:https://www.cnblogs.com/wuxiaoru/p/11504768.html

时间: 2024-08-29 22:59:07

python学习第七周之静态方法、类方法、属性方法和一些类的成员方法的相关文章

Python学习--第七周

本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典类vs新式类 把下面代码用python2 和python3都执行一下 1 #_*_coding:utf-8_*_ 2 3 4 class A: 5 def __init__(self): 6 self.n = 'A' 7 8 class B(A): 9 # def __init__(self): 1

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

Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的: 1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数: 2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例变量,但可以访问类变量: 3)静态方法有点像函数工具库的作用,而类成员方法则更接近类似Java面向对象概念中的静态方法. 静态方法 @staticmethod    def staticmd():        print '静态方法 @classmetho

python学习第七周之异常处理

1.异常处理 异常处理其实就是将程序抛出的错误抓住,以便能够不影响程序的运行. 我们先定义一个列表,跟一个字典 names=['wu','jack'] data={} (1)然后抓住它们抛出的异常: try: names[3] data['name'] except IndexError as e: print("列表操作错误",e) except KeyError as e: print("没有这个key",e) 以上这两个均异常,抓住一个异常便不会在往下走了,所

python学习笔记七:条件&循环语句

1.print/import更多信息 print打印多个表达式,使用逗号隔开 >>> print 'Age:',42 Age: 42   #注意个结果之间有一个空格符 import:从模块导入函数 import 模块 from 模块 import 函数 from 模块 import * 如果两个模块都有open函数的时候, 1)使用下面方法使用: module1.open()... module2.open()... 2)语句末尾增加as子句 >>> import ma

Python学习第七天课后总结

<html> ? python学习第七天课后总结: 今日内容: 一,,字符编码:其实就是人类的语言与机器的语言进行转化的一种媒介. ? 1,人类语言与机器语言对照关系的结构被称为:编码表 ? 常用编码表大致有以下几个: ? 1> ascii (ASCII) 现为今出现最早的编码表,采用一个字节来存储字母却无法编码汉字 ? 2> GBK 这个是专门为中文来制作的编码,国人专用 ? 3> Shift_JIS 日文使用的文件编码方式 ? 4> Euc-kr 韩文使用的编码方式

暑假学习第七周

这是暑假第七周了,在这周中我还是继续看java视频复习Java,了解一些在书上遗漏以及忘掉的知识点. 这几天我在网上学习了java的链表类的一些基本知识,C.C++的链表和java的有些不一样,在c中链表是用指针来进行操作的,而在java中使用引用来进行连接. 而且我总结出自己一些适合自己的学习方式. 这一周将老师发的的测试题完成了,之后我在网上又找到了和诺关于java的视频去看,马上就要开学了,我需要巩固自己学的Java知识来面对测试. 原文地址:https://www.cnblogs.com

Python学习第七天

类的静态方法 类方法及属性: 接着上节课的面向对象编程的继承和多态性: 经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了更多的功能,也是之后推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类. 1 class D: 2 3 def bar(self): 4 print 'D.bar' 5 6 7 class C(D): 8 9 def bar(self): 10 print 'C.bar' 11 12 13 class B(D)

Python学习(第一周)

大学毕业之后学习的Java开发最终却没有走上程序员之路.从事企业IT管理工作(运维.ERP.财务.).13年大数据很火的时候接触到SAP的BW.BO那时候觉得BI那就是大数据,现在想想那时多么肤浅啊.后来读了<货币战争><经济学原理>等经济学方面的书,明白了逻辑和哲学提供方向让我知道要做什么,统计学.数学让我知道用什么方法去做.然后在知乎等网站上了解相关的信息,最终选择了使用Python去做实现. 我选择的入门书籍是<Python基础教程  第2版> 同时也入手了<

python学习笔记(七) - 面向对象高级编程

一. 为类动态添加属性和方法: 1. 动态给一个实例添加属性和方法: 给一个实例绑定的方法,对另一个实例是不起作用的. class Student(object): pass s = Student() s.name = 'Michael' # 动态给实例绑定一个属性 print s.name def set_age(self, age): # 定义一个函数作为实例方法 self.age = age from types import MethodType s.set_age = MethodT