【Python】面向对象-类的成员,方法

成员共分为三类:

(1)变量

  • 实例变量(字段)
    • 公有实例变量(字段)
    • 私有实例变量(字段)
  • 类变量(静态字段)
    • 公有类变量(静态字段)
    • 私有类变量(静态字段)
class Foo:
    # 类变量(静态字段)
    country = "中国"

    def __init__(self, name):
        # 实例变量(字段)
        self.name = name

    def func(self):
        pass

# 准则:
#    实例变量(字段)访问时,使用对象访问,即: obj1.name
#     类变量(静态字段)访问时,使用类方法,即: Foo.country  (实在不方便时,才使用对象访问,即对象里没有才去类里找)

obj1 = Foo('季红')
obj2 = Foo('王晓东')
print(obj1.name)
print(Foo.country) # obj1.country ,对象也能访问类变量,但不推荐使用

# 知识点: 什么时候用类变量?
# 当所有对象中有共同的字段时且要改都改要删都删时,可以将 实例变量(字段) 提取到 类变量(静态字段)

私有字段与共有字段

# ######################## 公有实例变量(字段) ########################
"""
class Foo:

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

    def func(self):
        print(self.name)


obj = Foo('张凯雄')
print(obj.name)
print(obj.age)
obj.func()
"""


# ######################## 私有实例变量(私有字段) ########################
"""
class Foo:

    def __init__(self,name):
        # 私有实例变量(私有字段)
        self.__name = name
        self.age = 123

    def func(self):
        print(self.__name)

obj = Foo('张凯雄')
print(obj.age)
#obj.__name # 无法访问
obj.func()  # 找一个内部人:func, 让func帮助你执行内部私有 __name
"""

# ######################## 类变量(静态字段) ########################
"""
class Foo:
    country = "中国"

    def __init__(self):
        pass

    def func(self):
        # 内部调用
        print(self.country)
        print(Foo.country) # 推荐


# 外部调用
print(Foo.country)

obj = Foo()
obj.func()
"""

# ######################## 私有类变量(私有静态字段) ########################
"""
class Foo:
    __country = "中国"

    def __init__(self):
        pass

    def func(self):
        # 内部调用
        print(self.__country)
        print(Foo.__country)  # 推荐

# 外部无法调用私有类变量
# print(Foo.country)

obj = Foo()
obj.func()
"""

注:私有字段,连继承的子类都不能访问父类定义的私有字段

(2)方法
方法分为:实例方法,静态方法,类方法

先看实例方法

# ############### 没必要写实例方法 ##############
class Foo(object):

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

    def func(self):
        print('123')      #没有用有关对象的其他数据


obj = Foo('史雷')
obj.func()
# ############### 有必要写实例方法 ##############
"""
class Foo(object):
    def __init__(self, name):
        self.name = name

    def func(self):
        print(self.name)


obj = Foo('史雷')
obj.func()
"""

静态方法定义

# ############### 静态方法 ##############
# class Foo(object):
#     def __init__(self, name):
#         self.name = name
#
#     # 实例方法
#     def func(self):
#         print(self.name)
#
#     # 静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法
#     @staticmethod
#     def display(a1,a2):
#         return a1 + a2
#
# obj = Foo('史雷')
# obj.func()
#
# ret = Foo.display(1,3)
# print(ret)

# 总结
#   1. 编写时:
#        - 方法上方写 @staticmethod
#        - 方法参数可有可无
#   2. 调用时:
#       - 类.方法名()  *     推荐
#       - 对象.方法名()
#   3. 什么时写静态方法?
#       - 无需调用对象中已封装的值.

类方法定义

# ############### 类方法 ##############

class Foo(object):
    def __init__(self, name):
        self.name = name

    # 实例方法,self是对象
    def func(self):
        print(self.name)

    # 静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法
    @staticmethod
    def display(a1,a2):
        return a1 + a2

    # 类方法,cls是类
    @classmethod
    def show(cls,x1,x2):
        print(cls,x1,x2)

# 执行类方法
Foo.show(1,8)

# 总结
#   1. 定义时:
#        - 方法上方写: @classmethod
#        - 方法的参数: 至少有一个cls参数
#   2. 执行时:
#        - 类名.方法名()  # 默认会将当前类传到参数中.
#   3. 什么时用?
#        - 如果在方法中会使用到当前类,那么就可以使用类方法.

方法也有公有,私有之分

# ########################## 私有的实例方法 #######################
"""
class Foo(object):


    def __init__(self):
        pass

    def __display(self,arg):
        print('私有方法',arg)

    def func(self):
        self.__display(123)

obj = Foo()
# obj.__display(123) # 无法访问
obj.func()
"""
# ########################## 私有的静态方法 #######################
"""
class Foo(object):


    def __init__(self):
        pass

    @staticmethod
    def __display(arg):
        print('私有静态 方法',arg)

    def func(self):
        Foo.__display(123)

    @staticmethod
    def get_display():
        Foo.__display(888)

# Foo.__display(123) 报错

obj = Foo()
obj.func()

Foo.get_display()
"""

(3)属性(根据方法改造出来)

class Foo(object):
    def __init__(self):
        pass

    @property
    def start(self):
        return 1

    @property
    def end(self):
        return 10

obj = Foo()
print(obj.start)
print(obj.end)

# 总结:
#     1. 编写时
#            - 方法上方写 @property
#            - 方法参数:只有一个self
#     2. 调用时:无需加括号  对象.方法
#     3. 应用场景: 对于简单的方法,当无需传参且有返回值时,可以使用 @property
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bug 挖掘机

支持洋子

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值