面向对象进阶

---恢复内容开始---

主要介绍

  • 成员
  • 类的嵌套

类的成员分为三类: 

变量     实例变量(字段)      公有实例变量  (字段)                     只有对象可以调用

                                           私有实例变量(字段)

             类变量(静态字段)   公有类变量(静态字段)        对象和类都可以调用类变量,但是最好使用类来调用,更加规范

                                            私有类变量(字段)

                                             见实例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)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

---恢复内容结束---

posted @ 2018-08-28 17:36  团子emma  阅读(164)  评论(0)    收藏  举报