【Python】面向对象-类的成员,方法(Python是面向对象吗)

网友投稿 263 2022-08-27


【Python】面向对象-类的成员,方法(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 10obj = Foo()print(obj.start)print(obj.end)# 总结:# 1. 编写时# - 方法上方写 @property# - 方法参数:只有一个self# 2. 调用时:无需加括号 对象.方法# 3. 应用场景: 对于简单的方法,当无需传参且有返回值时,可以使用 @property


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【Python】SQLAlchemy使用方法介绍(Python sqlalchemy)
下一篇:Java 数据结构与算法系列精讲之环形链表
相关文章

 发表评论

暂时没有评论,来抢沙发吧~