当前位置 : 主页 > 编程语言 > python >

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

来源:互联网 收集:自由互联 发布时间:2022-06-24
成员共分为三类: (1)变量 实例变量(字段) 公有实例变量(字段) 私有实例变量(字段) 类变量(静态字段) 公有类变量(静态字段) 私有类变量(静态字段) class Foo: # 类变量(静态字段) count

成员共分为三类:

(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


上一篇:【Python】SQLAlchemy使用方法介绍
下一篇:没有了
网友评论