欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

面向对象之类的成员,嵌套

程序员文章站 2022-07-05 14:30:22
类的成员可分为三大类:字段丶方法和属性 一丶字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同. 普通字段属于对象 静态字段属于类 由上述代码可以看出[普通字段需要通过对象来访问] [静态字段通过类访问],在使用上可以看出普通字段和静态字段的归属是不 ......

类的成员可分为三大类:字段丶方法和属性

一丶字段

  字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同.

  普通字段属于对象

  静态字段属于类

class foo:
    #类变量(静态字段)
    country = "你好"

    def __init__(self,name):
        # 实例变量(普通字段)
        self.name = name
    def too(self):
        print("===========")

#直接访问普通字段
obj = foo("李白")
obj.too()
#直接访问静态字段
print(foo.country)

 

  由上述代码可以看出[普通字段需要通过对象来访问] [静态字段通过类访问],在使用上可以看出普通字段和静态字段的归属是不同的,其在内容的存储方式也不一样,静态字段在内存中只保存一份,普通字段在每个对象中都要保存一份

  上面我们看到的两种字段都是公有字段,下面为私有字段

class foo:
    #类变量(静态字段)
    country = "你好"
    #私有类变量(静态字段)
    __ctorens = "再见"

    def __init__(self,name,phone):
        # 实例变量(普通字段)
        self.name = name
        #私有示例变量(普通字段)
        self.__phone = phone
    def too(self):
        print(foo.__ctorens)

#直接访问普通字段
obj = foo("李白","165136851546")
obj.too()
#直接访问静态字段
print(foo.country)
#在类外面是没法访问类中的私有字段的,所以这里会报错
print(foo.ctorens)

面向对象之类的成员,嵌套

 

 二丶方法

  方法包括普通方法丶静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同

   1.普通方法:由对象调用,至少一个self参数,执行普通方法时,自动将调用该方法的对象赋值给self

   2.类方法:由类调用,至少一个cls参数,执行类方法时,自动将调用该方法的类赋值给cls

   3.静态方法:由类调用,无默认参数

# 实例方法
class foo:
    def __init__(self,name):
        self.name = name
    #实例方法
    def tom(self):
        pass
obj = foo("xx")
obj.tom()

#静态方法
#在方法前面加@staticmethod,方法名中的self也不用写了,可以写任何参数,调用直接用  类名.方法名(参数) 调用
class foo:
    def __init__(self,name):
        self.name = name
    #静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法
    @staticmethod
    def tom(a,b):
        print(a,b)
foo.tom(1,2)

# 类方法
#在方法前面加上@classmethod,方法名中参数必须有cls,cls是指类
class foo:
    def __init__(self,name):
        self.name = name

    def show1(self):
        print(self)
    # 类方法
    @classmethod
    def show(cls,a,b):
        print(cls,a,b)  #<class '__main__.foo'> 1 2
foo.show(1,2)

  方法跟字段一样,也分为私有跟公有,私有就是在方法名前面加上__,调用是不能在类外面直接调用,需要调用类中的一个公有方法,再在公有方法里调用私有方法

class foo:
    def __init__(self,name):
        self.name = name

    def show1(self):
        foo.__show(1,2)
    # 私有类方法
    @classmethod
    def __show(cls,a,b):
        print(cls,a,b)  #<class '__main__.foo'> 1 2

obj = foo("xx")
obj.show1()

 

 

三丶属性

  属性的定义时就是在普通方法的基础上添加@property装饰器,属性仅有一个self参数,调用时无需括号

 

class foo(object):
    def __init__(self):
        pass
    #属性在方法名前面加上@property
    @property  
    def start(self):
        return 1

obj = foo()
print(obj.start)    #无需加括号,直接调用

 

 

 四丶面向对象的嵌套

  两个类中的变量互相建立关系就叫嵌套

class school:
    def __init__(self,name):
        self.name = name
obj = school("舞蹈教室")
obj1 = school("音乐教室")
obj2 = school("美术教室")


class teacher:
    def __init__(self,name):
        self.name = name
t = teacher("舞蹈老师")
t1 = teacher("音乐老师")
t2 = teacher("美术老师")

#############为老师分配教室
t.school = obj
t1.school = obj1
t2.school = obj2
############查看t1老师所在的教室
print(t1.school.name)