面向对象进阶
---恢复内容开始---
主要介绍
- 成员
- 类的嵌套
类的成员分为三类:
变量 实例变量(字段) 公有实例变量 (字段) 只有对象可以调用
私有实例变量(字段)
类变量(静态字段) 公有类变量(静态字段) 对象和类都可以调用类变量,但是最好使用类来调用,更加规范
私有类变量(字段)
见实例1
方法 实例方法 也分私有和公有 只有对象可以调用
静态方法 也分私有和公有 对 象和类都可以调用静态方法,但是最好使用类来调用,更加规范
类方法 私有 和公有 对象和类都可以调用 类方法 ,但是最好使用类来调用,更加规范
见实例2
属性 私有和公有 只有对象可以调用. 且调用时不加括号
见实例3
实例1
公有字段:外部能直接访问的字段
私有字段:外部不能直接访问,需要间接才能访问 __(双下划线加在字段或者是方法,属性名前面,即可变成私有)
# ************************************** class Foo: country = "China" # 类变量(静态字段) 在这里不用写self. def __init__(self,name): self.age = 18 #实例变量(字段) def school(self): pass # 调用 # obj1 = Foo("王菲") #实例化了一个对象 # print(obj1.country) # China 可以通过 对象 调用 # print(Foo.country) # China 可以通过 类 调用 # 可以改变country的值吗? # obj1.country = "America" # print(obj1.country) # America 可以通过 对象 调用改变自己print(obj1.country) # America 可以通过 对象 调用国家的值改变自己 # obj2 = Foo("张杰") #又实例化了一个对象 # print(Foo.country) #China 类调用的country值却是没有变,证明对象1 只改变了自己country的值 # print(obj2.country) #China 对象2 调用country是China,再一次证明1只改变自己country的值
再次提醒:对象和类都可以调用类变量,但是最好使用类来调用,更加规范
***************************************************************************
##########################私有内部访问,和间接访问 class Foo: __country = "China" # 私有类变量(静态字段) 在这里不用写self. def __init__(self,name): self.__age = 18 #私有 实例变量(字段) self.name = name def school(self): print(self.__age) print(self.__country) # 我们试着在外部访问以下私有字段 # obj1 = Foo("王菲") #实例化了一个对象 # print(obj1.__country) # 报错 'Foo' object has no attribute '__country' # print(Foo.__country) # 报错type object 'Foo' has no attribute '__country' # print(obj1.__age) # 报错'Foo' object has no attribute '__age' # print(obj1.name) #王菲 因为name没有加 __,没有被私有化 # 那如何能在外部进行间接访问 在内部school方法里进行内部访问print(self.__age)和print(self.__country) # obj1.school() #18 China 访问成功
# ~~~~~~~~~~~~~~~~~ 那他的子类能不能访问到他的私有字段呢,下面验证一下 # class Foo(object): # # __country = "China" # 私有类变量(静态字段) 在这里不用写self. # # def __init__(self): # self.__age = 18 #私有 实例变量(字段) # # def school(self): # print(self.__age) # print(self.__country) # class Son(Foo): # # def __init__(self): # # pass # def sonon(self): # # print(self.__country) # print(self.__age) # son = Son()#报错Son' object has no attribute '_Son__country' # son.sonon()#报错'Son' object has no attribute '_Son__age'
# 怎样访问呢,通过间接方法试一下 class Fooo(object): __country = "China" # 私有类变量(静态字段) 在这里不用写self. def __init__(self): self.__age = 18 # 私有 实例变量(字段) def school(self): print(self.__age) print(self.__country) class Abb(Fooo): def sonon(self): self.school() # son1 = Abb() #18 # son1.sonon() # China 访问成功
实例方法
# 实例方法 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
@staticmethod
def func(a1,a2): #静态方法 通过和类实例调用 最好使用类调用.不必传self的值.
return a1+a2
obj = Foo('..')
print(obj.func(2,3)) #5
print(Foo.func(3,6))#9
类方法
可以方便的查看当前类 最好使用类调用
class Foo(object): def __init__(self, name): self.name = name @classmethod def func(ca1,a1,a2): #类方法 通过和类实例调用. 可以方便的查看当前类 print(cal,a1,a2) obj = Foo('..') obj.func(2,3) #<class '__main__.Foo'> 2 3 Foo.func(3,6)#<class '__main__.Foo'> 3 6 此处不用手动传类的参数,类方法自动传上
*****************88
class Foo(object):
def __init__(self, name):
self.name = name
@classmethod
def func(ca1,): #类方法 通过和类实例调用. 可以方便的查看当前类 此处至少一个cal参数
print(ca1)
obj = Foo('..')
obj.func() #<class '__main__.Foo'>
Foo.func()#<class '__main__.Foo'> 此处不用手动传类的参数,类方法自动传上
属性
class Foo(object): def __init__(self, name): self.name = name @property def func(self): #属性 只能通过对象调用.当无需传参,有返回值时建议应用实行 return self.name obj = Foo("张杰") print(obj.func) #张杰 注意调用不加括号 print(Foo.func) 打出的是对象内存地址
那上面的成员类型就介绍完毕了.可以归纳一下
下面讨论嵌套
class Teacher: def __init__(self,name,age): self.name =name self.age = age t1 = Teacher("王哈哈",45) t2= Teacher("张哈",35) class School: def __init__(self,name,location): self.name =name self.location = location s1 = School("一中","一区") s2= School("二中","三区") t1.school = s1 print(t1.school.name) print(t1.name)
---恢复内容结束---

浙公网安备 33010602011771号