day⑦:类的3大成员

start

py3

类的三大成员: 字段(变量)  、属性、方法

一.字段(实例变量和类变量)

例子:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

#!/usr/bin/env python

#coding=utf-8

class Province:

    ‘‘‘

    字段(变量)包括:普通字段(实例变量)和静态字段(类变量),他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,

    普通字段(实例变量)属于对象

    静态字段(类变量)属于类

    ‘‘‘

    #静态字段(类变量)

    country="中国"

    def __init__(self,name):

        #普通字段(实例变量)

        self.name=name

#直接访问普通字段(实例变量)

obj=Province("广州")

print(obj.name)

obj.name="你妹"

obj.name2="你妹2"

obj.yaobin="自己定义实例变量"

print(obj.name)

print(obj.name2)

print(obj.yaobin)

#直接访问静态字段(类变量)

print(Province.country)

##结果:

广州

你妹

你妹2

自己定义实例变量

中国

二.属性

①装饰器方式定义属性之新式类


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

#!/usr/bin/env python

#coding=utf-8

 

‘‘‘

装饰器方式:在类的普通方法上应用@property装饰器

‘‘‘

 

#新式类

class animal(object):

    ‘‘‘

    新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法

    ‘‘‘

 

    def __init__(self, name):

        self.name = name

        self.num = None

 

 

 

    @property

    def price(self):

        return self.num

 

 

    @price.setter

    def price(self,num):

        self.num=num

        print("设置num",self.num)

 

 

    @price.deleter

    def price(self):

        print("删除",self.num)

        del self.num

 

 

 

dog=animal("随便"#实例化

 

################################################################################

 

print(dog.price)  # 自动执行 @property 修饰的 price 方法,并获取方法的返回值

                  #输出是None

 

dog.price="123456"  # 自动执行 @price.setter 修饰的 price 方法,并将  123456 赋值给方法的参数

print(dog.price)     #现在是123456了

 

 

del dog.price     # 自动执行 @price.deleter 修饰的 price 方法

#print(dog.price)  #再打印,是会报错的

 

 

##结果:

None

设置num 123456

123456

删除 123456

②装饰器方式定义属性之经典类


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

#!/usr/bin/env python

#coding=utf-8

‘‘‘

装饰器方式:在类的普通方法上应用@property装饰器

‘‘‘

#经典类

class Goods:

    ‘‘‘

    经典类中的属性只有一种访问方式,其对应被 @property 修饰的方法

    ‘‘‘

    @property

    def price(self):

        return "yaobin"

obj=Goods()

result=obj.price #自动执行 @property 修饰的 price 方法,并获取方法的返回值

print(result)

#结果:

yaobin

③静态字段(类变量)方式定义属性


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

#!/usr/bin/env python

#coding=utf-8

‘‘‘

创建值为property对象的静态字段(类变量)

‘‘‘

class Foo(object):

    ‘‘‘

    当使用静态字段(类变量)的方式创建属性时,经典类和新式类无区别

    ‘‘‘

    def __init__(self,name):

        self.name = name

        self.num = None

    def get_bar(self):

        return self.num

    #必须两个参数

    def set_bar(self,num):

        self.num=num

        print("设置num",self.num)

    def del_bar(self):

        print("我要删了num",self.num)

        del self.num

    BAR=property(get_bar,set_bar,del_bar,‘描述信息‘)

obj=Foo("haha"#实例化

#############调用##################

 # 自动调用第一个参数中定义的方法:get_bar

print(obj.BAR)

# 自动调用第二个参数中定义的方法:set_bar方法,并将123456当作参数传入

obj.BAR=123456

print(obj.BAR)

# 自动调用第三个参数中定义的方法:del_bar方法

del obj.BAR

#print(obj.BAR)  #再打印,报错!

##结果:

None

设置num 123456

123456

我要删了num 123456

三.方法

1.普通方法、2.类方法、3.静态方法

例子:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

#!/usr/bin/env python

#coding=utf-8

 

class Foo:

    ‘‘‘

    方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。

 

    普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;

    类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;

    静态方法:由类调用;无默认参数;

    ‘‘‘

    test="gril" #类变量

 

    def __init__(self,name):

        self.name=name

 

    def ord_func(self):

        """ 定义普通方法,至少有一个self参数 """

        print("普通方法%s"%(self.name))

 

 

    @classmethod

    def class_func(cls):

        """ 定义类方法,至少有一个cls参数 """

        #print("类方法 %s",self.name)  #不能访问普通字段(实例变量)

        print("类方法",Foo.test) #可以访问静态字段(类变量)

 

    @staticmethod

    def static_func():

        """ 定义静态方法 ,无默认参数"""

        print("静态方法")   #不能访问类变量(静态字段),也不能访问实例变量(普通字段),和类就一个组织逻辑关系,没什么用

 

 

#实例化

obj=Foo("yaobin")

 

 

 

#调用普通方法

obj.ord_func()

 

 

#调用类方法

Foo.class_func()

 

 

#调用静态方法

Foo.static_func()

 

 

##结果:

普通方法yaobin

类方法 gril

静态方法

end

来自为知笔记(Wiz)

时间: 2024-11-08 06:00:14

day⑦:类的3大成员的相关文章

福利->KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型

我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型. 废话不多说,直接上代码: 1.工具类(其实就是NSObject的一个分类)头文件 1 #import <Foundation/Foundation.h> 2 3 @interface NSObject (YSRuntime) 4 5 /** 6 返回当前类的属性数组 7 8 @return 属

iOS 在类实现定义中声明成员变量的怪异方式

WebGL 规范(WebGL Specification) 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的漂亮人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 看看下面的使用方法,几年前系统地看过 Objective-C 2.0 的官方文档和那本

类的三种成员与继承

对于类而言,一共有三种成员类型,分别为private,protected,public.其中,如果数据成员的类型为private,可以默认不写.对于在类外使用的情况,private和protected是一致的,均不可以由外部直接访问,而public所包含的成员是可以由外部直接访问的.下面给出一个基本的例子. 12345678910111213141516171819202122 class Time { private: int hour; int minute; protected: int

浅析在类模版中构建成员函数时,使用memcpy产生的副作用

一般情况下我们在对类模版中的成员函数进行构建时会经常对一些数据进行复制拷贝,而通常情况下我们都不提倡用memcpy进行拷贝,因为在类模版中所传进来的类型可以是内置类型也可以是非内置类型,除非你在成员函数中使用memcpy前进行类型萃取,否则它所带来的副作用的后果也是很可怕的.memcpy在对内置类型可正常拷贝,而在对非内置类型拷贝时会出现浅拷贝的现象. 下面我们可以通过一个简单的顺序表程序来分析memcpy对非内置类型所产生的副作用: #include<iostream> #include&l

类和对象:成员属性、成员方法 — 学习笔记3

类成员  类成员的访问控制PHP5中对类成员属性或成员方法的访问控制,是通过在其前面添加关键字 public(公有).protected(保护)或 private(私有)来实现的,如果没有设置这些关键字,则该成员方法被默认设置为 public. 类的访问控制权限具体应用规则如下:·由 public 所定义的类成员可以在任何地方被访问.·由 protected 所定义的类成员可以被其他所在类的子类和父类访问.·由 private 所定义的类成员只能被其所在类访问. 成员属性 在类中定义的变量称为成

Cocos2d-x 3.1.1 学习日志3--C++ 初始化类的常量数据成员、静态数据成员、常量静态数据成员

有关const成员.static成员.const static成员的初始化: 1.const成员:只能在构造函数后的初始化列表中初始化 2.static成员:初始化在类外,且不加static修饰 3.const static成员:类只有唯一一份拷贝,且数值不能改变.因此,可以在类中声明处初始化,也可以像static在类外初始化 #include <iostream> using std::cout; using std::endl; class base { public: base(int

C++类中常量数据成员和静态数据成员初始化

常量数据成员初始化原则: 在每一个构造函数的初始化列表中初始化 静态数据成员初始化原则: 类内声明,类外初始化(因为它是属于类的,不能每构造一个对象就初始化一次) // test_max.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include <iostream> #include <vector> using namespace std; class A { public: A(int i):a(0) {} A():

c++类中对数据成员进行初始化和赋值的区别

在c++中定义一个类 ,对于构造函数 我们经常是这么写的: class test { public: test(int n_x , int n_y) { x = n_x; y = n_y; } private: int x , y; }; 这中写法虽然是合法的但比较草率 在构造函数 test(int n_x , int n_y)中 , 我们这样实际上不是对数据成员进行初始化 , 而是进行赋值. 正确的是初始化应该是这样的: class test { public: test() {} test(

为什么C++空类的实例大小为1

[为什么C++空类的实例大小为1] 每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所以大小为1. 参考:http://bbs.csdn.net/topics/370134485 为什么C++空类的实例大小为1,布布扣,bubuko.com