字段、方法、属性

  • 注意问题:
    • pickle,load报错:
      • 场景:A文件中定义了class,在B文件中load报错
      • 原因:B中没有A中定义的class,需要 from A import class

一、面向对象 python 类成员    

1、字段:

  • example:
class Province:

country = ‘CN‘     //静态字段,保存在类中

def __init__(self,name):

self.name = name  //动态字段,保存在对象中

hn = Province(‘河南‘)

sx = Province(‘陕西‘)

  • 图示:
    • 静态字段:
      • 位置:保存在类中,一般将所有对象相同的字段(即实现知道,所有对象的该字段值都一样)放在类中
      • 数量:在类中保存一份
      • 引用:通过类进行访问,Class.var_name
    • 动态字段:
      • 位置:保存在对象中
      • 数量:在每个对象中保存一份
      • 访问:通过对象访问,obj.var_name
  • 注意:
    • 何时创建字段
      • 静态字段,代码加载是会直接存储在内存中,
      • 动态字段,实际上是方法(函数)内部变量,只有真正调用该方法时才会创建存储

2、方法 

  • 方法中对字段的引用问题说明:

  • python 支持3种方法,所有方法均属于类
    • 调用方式图解

    • 普通方法:
      • 参数:至少一个self
      • 调用:由对象调用执行
    • 静态方法:
      • 参数:没有self参数,0个或多个用户自定义参数
      • 调用:由类调用执行
      • 解释:
        1. 写在类中只是为了说明该方法和这个类是相关的
        2. 没有使用到动态字段的方法(即该方法跟对象没有什么关系,对象自身只存了动态字段) 就可以定义为静态方法,通过类来直接调用
    • 类方法:
      • 参数:至少一个cls
      • 调用:由类调用执行
      • 解释:
        1. 只是比静态方法多传了一个cls形参,自动将类的名称传递给cls(不是str类型,是class类型)
  • example:
class Province:

country = ‘CN‘

def __init__(self,name):

self.name = name

# 普通方法

def show(self):

print(self.name)

# 静态方法

@staticmethod

def f1(arg):           //没有self参数,有用户参数arg,可以有多个

print(‘xxxx‘,arg)

# 类方法

@classmethod

def function(cls):  //至少要有一个cls参数,可以有N个用户参数arg

pass

# 动态方法,对象去调用执行

obj = Province(‘shanxi‘)

obj.show()

# 静态方法,类去调用执行

Province.f1(‘qiaogy‘)

# 类方法,类调用执行

Province.function()      //python会自动讲该“类名称”传递给cls参数



3、属性:

  • 解释:
    • 不伦不类的东西,可以通过“操作字段”的方式,调用相应的函数
    • 实则是 python提供的一种关联关系,即若用户执行了“字段的操作”,则可以执行相应的方法,具体方法中做什么事情可以自定义
    • 属性有2中表示形式:装饰器、property函数
  • 通过装饰器表示关联关系

class Pager:

def __init__(self,all_count):

self.all_count = all_count

@property                         # 可以不加括号调用

def function1(self):

pass

@function1.setter               # 可以赋值调用,因为是赋值,所以必须要有参数接收值

def all_pager(self,value):

pass

@function1.deleter              # 可以删除调用

def all_pager(self):

pass

# 实例化对象,并通过属性进行方法调用

obj = Pager(101)

obj.all_pager            # 类似访问字段的样子,调用相应的方法,(访问字段没有括号)

obj.all_pager = 111  # 类似字段赋值的方式,调用相应的方法,且将值传给函数的形参

del obj.all_pager       # 类似字段删除的方式,调用相应的方法

  • 通过property函数定义关联关系
  • property 构造函数:
    • 格式:
      • bind = property(fget=方法名1, fset=方法名2, fdel=方法名3 )
    • 参数:
      • fget: 当调用 对象.bind 时,会自动执行指定方法
      • fset: 当调用 对象.bind = ‘xxx‘ 时, 会自动执行指定方法
      • fdel: 当调用 del 对象.bind 时,会自动执行指定方法

class Pager:

def __init__(self,all_count):

self.all_count = all_count

# 三个方法

def f1(self):

pass

def f2(self,value):

pass

def f3(self):

pass

# 创建属性关联关系,相当于对property函数传关键字参数

foo = property(fget=f1, fset=f2, fdel=f3)

# 实例化对象,并通过属性进行方法调用

p = Pager(101)

p.foo                # 通过foo字段规定的属性关系中找 fget指向的函数名,并执行该函数   (若有返回值,可接受,比如ret = p.foo)

p.foo = ‘111‘    # 通过foo字段规定的属性关系中找 fset 指向的函数名,并执行该函数

del p.foo          # 通过foo字段规定的属性关系中找fdel指向的函数名,并执行该函数

类成员之成员修饰符

四、成员修饰符

五、特殊成员

__init__

__doc__

__call__

__setitem__

...

六、边缘知识

isinstance

issubclass

2.7 中的继承

应用:

自定义类型:有序字典

源码的扩展:思路,

七、异常处理

八、设计模式之单例模式

时间: 2024-11-08 22:00:25

字段、方法、属性的相关文章

字段 | 方法 | 属性 | 类的成员 | Python

# ----------------------------------------- 字段 class Class: # 静态字段,属于类 # 已经创建,并且存放在类里,而不是每创建一个对象创建一次; country = '中国' def __init__(self, name): # 普通字段-->> 保存在创建的对象里 self.name = name # 普通方法-->> 保存在类里 def show(self): print(self.name) # 实例化对象 obj

Python类中的字段,方法,属性区别及StaticMethod, Property

类包含下列 静态属性 动态属性 静态方法 动态方法 class Province: #静态字段--属于类,调用方法类.字段名 memo = "中国23个省之一" #动态字段--属于对象,调用方式实例化对象.字段名 def __init__(self, name, capital, leader): self.Name = name self.Capital = capital self.Leader = leader #动态方法--属于对象 def sports_game(self):

C#中的类:字段、属性、方法

C++的类中可以有三种内容:成员变量.成员函数和友元. 一般来说,成员变量描述类的属性,成员函数描述类的操作,友元则是一种特殊的声明,被声明为友元的函数或类可以操作自己的私有成员变量和成员方法. 在Java中,类的成员有两类:属性,相当于C++的成员变量:方法,相当于C++的成员函数. 而在C#中,类的成员有四种:字段.属性.方法和事件(事件还没学到,暂缓解释). 字段相当于C++中的成员变量和Java中的属性,就是在类中定义的变量(可以是基本类型或引用类型),一般来说,字段都被定义为私有. 方

[.net 面向对象编程基础] (9) 类的成员(字段、属性、方法)

[.net 面向对象编程基础] (9) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态成员(static)和非静态成员 b.静态成员用static标识,不标识则默认为非静态成员 c.静态成员属于类所有,动态成员则属于实例所有,即对象 d.静态成员为类所有实例共享,无论类有多少实例或副本,静态成员只占用存中一块区域.非静态成员则在类的每个实例,都创建一个内存域. 下面主要说明一下类的主要

C# 常量,变量,字段,属性,方法

常量:指在程序编译时已经存在且在程序生命周期内不会发生改变的值,用const定义一个常量. private class TestA     --定义一个类时后边不加() { private const double Pi=3.14; private double GetPi()   --输出pi值得方法,后边带() { double t=pi; return t; } } 变量: 变量本身被用来存储特定类型的数据,可以根据需要随时改变变量中所存储的数据值.变量具有名称.类型和值.变量名是变量在程

C# 字段、属性、成员变量 [转载]

一.定义与作用 1.字段(field):是C#类级别定义的,和方法同一级别. 一般用来类内部进行访问,充当一种类中的"全局变量"角色:或者配合属性来使用 2.属性:同样是C#类级别定义的,一般是供外部类访问的. 3.成员变量:"全局变量",在类中定义的变量,区别于在方法中定义的局部变量.它与字段属性不是同一级别概念,字段,属性都可以叫做成员变量. 二.使用 class Basic { private string FieldVar;//这是字段,在当前类中调用 pr

字段与属性(c#)

对实现者来说像方法 对调用者来说像字段 可以将属性看成一种智能字段,属性就是字段与方法的扩展. 面向对象的一个原则就是数据封装,所以不能将字段以公有方式提供给外界. 就像上面例子不能给年龄赋负数,而不使用属性要给外界提供私有字段就得写两个get set 方法,用属性的话虽然使类型定义变得复杂了,但代码写起来却改善了许多.

字段和属性的区别

可以理解为字段是类内部用的,属性是类外部用的. 下面是个C#写的例子,这个例子作用是可以通过属性获取时间值,但是只能通过SetTime()方法设定时间值,我想这也是为什么要分字段和属性的一大原因吧. 首先声明的是private类型的变量(字段)hours,通常字段写法都是加个"_"符号,然后声明只读属性hours. 在类内部可以通过变量(字段)对其进行读写,在类外部不能访问变量(字段),只能访问属性.而且在此例内如果想修改时间值,只能通过调用SetTime()方法往里传值(因为这里的各

C#:字段与属性

MSDN中是这么介绍字段和属性的: A field is a variable of any type that is declared directly in a class or struct. 字段:“字段”是直接在类或结构中声明的任何类型的变量. A property is a member that provides a flexible mechanism to read, write, or compute the value of a private field.Properti

C#.NET中的字段与属性_1

一个类中需要有描述这个类信息的数据,而存储这些数据的变量就成为字段. 字段默认的访问级别为private(只有本类可以直接访问),我们将其访问级别改为public,在其他类中就可以访问了. 字段和属性表示对象包含的信息,字段类似于变量,因为可以直接读取或设置他们. 属性是对字段的封装.属性可以对字段的访问进行控制,可以进行非法设置值的判断.属性并不存储数据,字段存储数据. 封装后,有一些字段我只能赋值,不能读取,有些只能读取,不能赋值,而且可以对传过来的值进行选择. 建议所有的字段不要写成pub