Python入门(十九)——复习面向对象编程进阶知识——成员(字段、方法、属性)、成员修饰符(公有、私有)


类成员包括

  • 字段:普通字段(有self,属于对象)、静态字段(无self,属于类)
  • 方法:普通方法(无装饰,形参必须包含self)、静态方法(@staticmethod装饰,不需要self形参)、类方法(@classmethod装饰,必须cls作为形参,参数为类,一般用不到,因为类方法可以用静态方法替代,传入类作为参数)
  • 属性:一种只能通过方法名进行调用传参的方法(@property进行装饰)

1. 字段

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

普通字段属于对象
静态字段属于类


    # 静态字段
    country = '中国'

    def __init__(self, name):

        # 普通字段
        self.name = name


# 直接访问普通字段
obj = Province('河北省')
print obj.name

# 直接访问静态字段
Province.country

由上述代码可以看出【普通字段需要通过对象来访问】【静态字段通过类访问】,在使用上可以看出普通字段和静态字段的归属是不同的。其在内容的存储方式类似如下图:
在这里插入图片描述
由上图可是:

静态字段在内存中只保存一份
普通字段在每个对象中都要保存一份
应用场景: 通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段
静态字段通过类名修改则会彻底改变,通过对象修改则只改变当前对象的静态字段

2. 方法

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

  • 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
  • 类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
  • 静态方法:由类调用;无默认参数;
class Foo:

    def __init__(self, name):
        self.name = name

    def ord_func(self):
        """ 定义普通方法,至少有一个self参数 """

        # print self.name
        print '普通方法'

    @classmethod
    def class_func(cls):
        """ 定义类方法,至少有一个cls参数 """

        print '类方法'

    @staticmethod
    def static_func():
        """ 定义静态方法 ,无默认参数"""

        print '静态方法'


# 调用普通方法
f = Foo()
f.ord_func()

# 调用类方法
Foo.class_func()

# 调用静态方法
Foo.static_func()

方法的定义和使用

在这里插入图片描述
相同点:对于所有的方法而言,均属于类(非对象)中,所以,在内存中也只保存一份。

不同点:方法调用者不同、调用方法时自动传入的参数不同。

应用场景:
普通方法:依赖对象的值
静态方法:不需要任何对象的值,只需要类名即可调用
类方法:完全可以I用静态方法将本类名传入即可

3. 属性

3.1 属性的建立方式1——@property装饰

class MyClass:
    # 静态字段
    name = 'zhao'

    def __init__(self):
        pass

    @property
    def myper(self):
        return MyClass.name

    @myper.setter
    def myper(self, val):
        MyClass.name = val
        print(val)

    @myper.deleter
    def myper(self):
        print('delet myper')

obj = MyClass()
print(obj.myper)
obj.myper = 'jun'
print(obj.myper)
del obj.myper

运行结果
在这里插入图片描述

3.2 属性的建立方式2——property构造方法

'''属性的建立方法之二:利用property构造函数'''
class MyClass:
    def __init__(self):
        pass

    def get_per(self):
        return 'this is myproperty'

    def set_per(self, val):
        print( 'this is set %s' % val)

    def del_per(self):
        print('this is del')

    myper = property(get_per, set_per, del_per)


obj = MyClass()
print(obj.myper)
obj.myper = 'ren'
del obj.myper

运行结果
在这里插入图片描述

4. 成员修饰符

类成员分为两类:私有成员、公有成员

私有成员通过对象无法访问,只能类内部进行调用,子类也无法继承父类的私有成员

4.1 私有字段

'''类静态、普通字段私有成员举例'''
self.__name = 'zhao'
__name = 'zhao'

在原来字段之前加上双下划线即可

4.2 私有方法

同私有字段,只要在三类方法名前面加上双下划线即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值