面向对象成员

 一.类成员:变量,方法和属性

类后面一加( ) 自动执行__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

 

posted @ 2018-11-13 12:04  2275114213  阅读(37)  评论(0)    收藏  举报