成员共分为三类: (1)变量 实例变量(字段) 公有实例变量(字段) 私有实例变量(字段) 类变量(静态字段) 公有类变量(静态字段) 私有类变量(静态字段) class Foo: # 类变量(静态字段) count
成员共分为三类:
(1)变量
- 实例变量(字段)
- 公有实例变量(字段)
- 私有实例变量(字段)
- 类变量(静态字段)
- 公有类变量(静态字段)
- 私有类变量(静态字段)
# 类变量(静态字段)
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