面向对象成员
一.类成员:变量,方法和属性
类后面一加( ) 自动执行__init__方法
1.变量:
-实例变量(字段)
公有实例变量
私有实例变量
- 类变量(静态字段)
公有类变量
私有类变量
2.方法:
-实例方法
-静态方法:(本质上是函数)
-类方法
3.属性:

class Foo: # 类变量(静态字段) country = "中国" def __init__(self, name): # 实例变量(普通字段) self.name = name def func(self): pass # 知识点一:易错点 obj1 = Foo('季红') obj2 = Foo('王晓东') # 练习1 # obj1.name = 'alex' # print(obj1.name) #alex # print(obj2.name) #王晓东 # # 练习2 # obj1.country = '美国' # print(obj1.country) #美国 # print(obj2.country) #中国 # 练习3 # Foo.country = '美国' # print(obj1.country) #美国 # print(obj2.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) #123 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() """
注意:私有字段;连他儿子都不知道:
class Base(object): __secret = "受贿" def zt(self): print(Base.__secret) class Foo(Base): def func(self): print(self.__secret) print(Foo.__secret) obj = Foo() obj.zt() #受贿 obj.func() # AttributeError: 'Foo' object has no attribute '_Foo__secret'
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,不用带self,可以通过类和对象调用建议使用类 # 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是类 cls传递的是当前类 @classmethod def show(cls,x1,x2): print(cls,x1,x2) # 执行类方法 Foo.show(1,8) # 总结 # 1. 定义时: # - 方法上方写: @classmethod # - 方法的参数: 至少有一个cls参数 # 2. 执行时: # - 类名.方法名() # 默认会将当前类传到参数中. # 3. 什么时用? # - 如果在方法中会使用到当前类,那么就可以使用类方法. # class foo: # def func(self): # pass # @staticmethod # def fun(): # pass # def haha(): # pass # from types import MethodType,FunctionType # def func(*argc): # for i in argc: # if isinstance(i,MethodType): # print('这是一个方法') # elif isinstance(i,FunctionType): # print('只是一个函数') # func(foo.fun,foo().fun,foo.func,foo().func) # class foo: # country='中国' # @staticmethod # def func(): # pass # obj=foo() # print(foo.func,type(obj.func)
方法成员修饰符
-私有实例方法
-公有实例方法
# ########################## 私有的实例方法 ####################### """ 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 def start(self): return 1 def end(self): return 10 obj = Foo() obj.start() obj.end() """ 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
时.嵌套:
创建三个学校且三个学校的设施内容等都是一致. """ class School(object): def __init__(self, name, address): self.name = name self.address = address def speech(self): print('讲课') obj1 = School('北京校区', '美丽富饶的沙河') obj2 = School('上海校区', '浦东新区') obj3 = School('深圳校区', '南山区') class Teacher(object): def __init__(self, name, age, salary): self.name = name self.age = age self.__salary = salary self.school = None t1 = Teacher('李杰', 19, 188888) t2 = Teacher('艳涛', 18, 60) t3 = Teacher('女神',16, 900000) # ############## 老师分配校区 有两种方式:方式二见下 t1.school = obj1 t2.school = obj1 t3.school = obj2 # #################################### # 查看t1老师,所在的校区名称/地址 print(t1.school.name) print(t1.school.address) print(t1.name) print(t1.age) t1.school.speech()
# by luffycity.com class School: def __init__(self, address): self.address = address bj = School('北京校区') sh = School('上海校区') sz = School('深圳校区') class Course(object): def __init__(self, name, period, price, school=None): self.name = name self.period = period self.price = price self.school = school py1 = Course('Python全栈', 110, 19999, bj) py2 = Course('Python全栈', 110, 19999, sh) py3 = Course('Python全栈', 110, 19999, sz) l1 = Course('Linux运维', 110, 19999, bj) l2 = Course('Linux运维', 110, 19999, sh) g1 = Course('Go开发', 119, 19999, bj) class Grade(object): def __init__(self, name, people, introduce, course=None): self.name = name self.people = people self.introduce = introduce self.course = course gr1 = Grade('全栈1期',20,'....',py1) gr2 = Grade('全栈1期',20,'....',py2) gr3 = Grade('Linux8期',20,'....',l2) #打印GR1的校区姓名 gr1.people gr1.course.price gr1.course.school.address
组合补充:
1.
# ### 2. 对象中到底有什么? # class Foo(object): # # def __init__(self,age): # self.age = age # # def display(self): # print(self.age) # # data_list = [Foo(8),Foo(9)] # for item in data_list: # print(item.age,item.display()) print(里面有其他函数 先执行其他函数),然后执行print()

2.
# class StarkConfig(object): # # def __init__(self,num): # self.num = num # # def changelist(self,request): # print(self.num,request) # # class RoleConfig(StarkConfig): # # def changelist(self,request): # print('666') # # # 创建了一个列表,列表中有三个对象(实例) # # [ StarkConfig对象(num=1), StarkConfig对象(num=2), RoleConfig对象(num=3) ] # config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)] # for item in config_obj_list: # print(item.num) # 1 2 3
3.
class StarkConfig(object): def __init__(self,num): self.num = num def changelist(self,request): print(self.num,request) class RoleConfig(StarkConfig): pass # 创建了一个列表,列表中有三个对象(实例) # [ StarkConfig对象(num=1), StarkConfig对象(num=2), RoleConfig对象(num=3) ] config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)] for item in config_obj_list: item.changelist(168)
# 1 168
2 168
3 168
4.
class StarkConfig(object): # # def __init__(self,num): # self.num = num # # def changelist(self,request): # print(self.num,request) # # def run(self): # self.changelist(999) # # class RoleConfig(StarkConfig): # # def changelist(self,request): # print(666,self.num) # # config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)] # config_obj_list[1].run() # 2 999 # config_obj_list[2].run() # 666 3

浙公网安备 33010602011771号