Python面向对象05/类的成员

Python面向对象05/类的成员

内容大纲

1.私有成员

2.类方法

3.静态方法

4.属性

5.issubclass isinstance区别

1.私有成员

1.私有类的属性
        在内部可以访问(本类内部方法中)
        # class A:
        #     name = '二狗'
        #     __name = '大狗'  # 私有类的属性
        #     def func(self):
        #         print(self.name)
        #         print(self.__name)
        # obj = A()
        # obj.func()
        类的外部不能访问
        # class A:
        #     name = '二狗'
        #     __name = '大狗'  # 私有类的属性
        #     def func(self):
        #         pass
        # obj = A()
        # print(obj.name)
        # print(A.__name)
        # print(obj.__name)
2.私有对象属性
只能在类的内部使用,不能在外部及派生类中使用
# class A:
#     name = '李业'
#     __name = '钢哥'
#
# class B(A):
#     def func(self):
#         print(self.__name)
#
# obj = B()
# # print(obj.__name) 不可以
# obj.func()  不可以
3.私有类的方法:
只能在类的内部使用,不能在外部及派生类中使用
# class A:
# 
#     def func(self):
#         self.__func()
#         print('in A func')
# 
#     def __func(self):
#         print('in A __func')

# obj = A()
# obj.func()  可以
# obj.__func()  不可以

对于私有类成员来说:当你遇到重要的数据/功能,(只允许本类使用的一些方法,数据)设置成私有成员
Python中所有私有成员都是纸老虎,形同虚设
# class A:
#
#     name = '李业'
#     __name = '钢哥'  # 私有类的属性
#
#     def __func(self):
#         print('in __func')
#
# print(A.__dict__)
# print(A._A__name)
类在加载时,只要遇到类中的私有成员,都会在私有成员前面加上__类名

2.类方法

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

1.类方法:一般就是通过类名去调用的方法,并且自动将类名地址传给cls,如果通过对象调用也可以,但是传的地址还是类名地址
    (并不是所有实例化都是在类外面)
2.类方法的作用:
    1.得到类名可以实例化对象
    2.可以操作类的属性
#3.定义:使用装饰器@classmethod.第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法)
# class A:
#     def func(self):
#         print('实例方法')
    # @classmethod
    # def cls_func(cls):
        # print(f'cls---->{cls}')
        # obj = cls()
        # print(obj)
        # print('类方法')
# print(A)
# A.cls_func()
# obj = A()
# obj.cls_func()

 简单应用
# 创建学生类,只要实例化一个对象,写一个类方法,统计一下具体实例化多少个学生?

# class Student:
#     count = 0
#     def __init__(self,name,id):
#         self.name = name
#         self.id = id
#         Student.addnum()
#     @classmethod
#     def addnum(cls):
#         cls.count = cls.count + 1
#     @classmethod
#     def getnum(cls):
#         return cls.count
#
# obj1 = Student('ergou', 12343243243)
# obj1 = Student('ergou', 12343243243)
# obj1 = Student('ergou', 12343243243)
#
# print(Student.getnum())

3.静态方法

不依赖对象与类的,其实静态方法就是函数
保证代码的规范化,合理的划分,后续维护性高
定义:使用装饰器@staticmethod.参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法
# import time
# class TimeTest(object):
#     def __init__(self, hour, minute, second):
#         self.hour = hour
#         self.minute = minute
#         self.second = second
#     @staticmethod   (相当于函数的作用)
#     def showTime():
#         return time.strftime("%H:%M:%S", time.localtime())
# print(TimeTest.showTime())
# t = TimeTest(2, 10, 10)
# nowTime = t.showTime()
# print(nowTime)

4.属性

property将执行一个函数需要函数名(),换成直接函数名
将动态方法伪装成一个属性,虽然在代码级别上没有什么提升,但是让你看起来更合理
# class Bmi:
#     def __init__(self,name,height,weight):
#         self.name = name
#         self.height = height
#         self.weight = weight
#     def bmi(self):
#         return self.weight/self.height**2
# obj = Bmi(二狗', 1.83, 65)
# print(obj.bmi())
# 结果虽然实现了,但是逻辑上感觉不合理.bmi应该是类似于name,age,height,等名词,
# 但是你把它当做方法使用了.

# class Bmi:
#     def __init__(self,name,height,weight):
#         self.name = name
#         self.height = height
#         self.weight = weight
#     @property
#     def bmi(self):
#         return self.weight/self.height**2
# obj = Bmi('二狗', 1.83, 65)
# print(obj.bmi)
# property 将执行一个函数需要函数名()变换成直接函数名.
# 将动态方法 伪装 成了一个属性,虽然在代码级别上没有什么提升,但是让你看起来更合理.

property 是一个组合.
# class Foo:
#     @property
#     def bmi(self):
#         print('get的时候运行我啊')
#     @bmi.setter
#     def bmi(self,value):
#         print(value)
#         print('set的时候运行我啊')
#         # return 111  # 无法得到返回值
#     @bmi.deleter
#     def bmi(self):
#         print('delete的时候运行我啊')
#         # return 111  # 无法得到返回值
# obj = Foo()
# # obj.bmi
# obj.bmi = 666 # 操作命令 这个命令并不是改变bmi的值,而是执行被bmi.setter装饰器装饰的函数
# # obj.bmi(666)
# del obj.bmi

应用场景:
    # 1, 面试会考一些基本的调用,流程.
    # 2, 工作中如果遇到了一些类似于属性的方法名,可以让其伪装成属性.

设置属性的两种方式:
1, 利用装饰器设置属性.
    # class Foo:
    #     @property
    #     def bmi(self):
    #         print('get的时候运行我啊')
    #
    #     @bmi.setter
    #     def bmi(self,value):
    #         print(value)
    #         print('set的时候运行我啊')
    #         # return 111  # 无法得到返回值
    #
    #     @bmi.deleter
    #     def bmi(self):
    #         print('delete的时候运行我啊')
    #         # return 111  # 无法得到返回值

2. 利用实例化对象的方式设置属性.
# class Foo:
#     def get_AAA(self):
#         print('get的时候运行我啊')
#     def set_AAA(self,value):
#         print('set的时候运行我啊')
#     def delete_AAA(self):
#         print('delete的时候运行我啊')
#     AAA = property(get_AAA,set_AAA,delete_AAA) #内置property三个参数与get,set,delete一一对应
# f1=Foo()
# f1.AAA
# f1.AAA='aaa'
# del f1.AAA

5.内置函数 isinstance issubclass

isinstance 判断的是对象与类的关系
#class A:
#    pass
#class B(A):
#    pass
#obj = B()

# isinstance(a,b) 判断的是 a是否是b类 或者 b类派生类 实例化的对象.
# print(isinstance(obj, B))  # True
# print(isinstance(obj, A))  # True

issubclass 类与类之间的关系
#class A:
#    pass
#class B(A):
#    pass
#class C(B):
#    pass

# issubclass(a,b) 判断的是 a类是否是b类 或者 b类派生类 的派生类.
# issubclass(a,b) 判断的是 a类是否是b类 子孙类.
# print(issubclass(B,A))
# print(issubclass(C,A))

5.今日练习

# 1.面向对象的私有成员有什么?
# 私有类的静态属性
# 私有类的方法
# 私有对象的属性
#
# 2.如何设置面向对象的类方法与静态方法,类方法静态方法有什么用?
# @classmethod
# 类方法:
#     1.得到类名可以实例化对象
#     2.可以操作类的属性
# @staticmethod
# 静态方法:
#     保证代码的规范性,合理划分,后续维护性高
#
# 3.面向对象中属性是什么?有什么作用?
# property是一种特殊的属性
# property将动态方法伪装为一个属性
#
# 4.isinstance与issubclass的作用是什么?
# isinstance(a,b)判断的是a是b类 或b类派生类的实例化对象
# issubclass(a,b)判断a类是b类 或b类派生类的派生类

5.看代码写结果:
# class A:
#     a = 1
#     b = 2
#     def __init__(self):
#         c = 3
# obj1 = A()
# obj2 = A()
# obj1.a = 3
# obj2.b = obj2.b + 3
# print(A.a)  #1
# print(obj1.b)  #2
print(obj2.b)  #5
# print(obj2.c)   #报错

#
# 6.看代码写结果:
# class Person:
#     name = 'aaa'
# p1 = Person()
# p2 = Person()
# p1.name = 'bbb'
# print(p1.name)  #bbb
# print(p2.name)  #aaa
# print(Person.name)    #aaa
#
# 7.看代码写结果:
# class Person:
#     name = []
# p1 = Person()
# p2 = Person()
# p1.name.append(1)
# print(p1.name)   #[1]
# print(p2.name)   #[1]
# print(Person.name)   #[1]
#
# 8.看代码写结果:
# class A:
#     def __init__(self):
#         self.__func()
#     def __func(self):
#         print('in A __func')
# class B(A):
#     def __func(self):
#         print('in B __func')
# obj = B()
# in A __func
#
9.看代码写结果:
# class Init(object):
#     def __init__(self, value):
#         self.val = value
# class Add2(Init):
#     def __init__(self, val):
#         super(Add2, self).__init__(val)
#         self.val += 2
# class Mul5 (Init):
#     def __init__(self, val):
#         super(Mul5, self).__init__(val)
#         self.val *= 5
# class Pro(Mul5, Add2):
#     pass
# class Iner(Pro):
#     csup = super(Pro)
#     def __init__(self, val):
#         self.csup.__init__(val)
#         self.val += 1
# print(Iner.mro())
#虽然没有见过这样的写法,其实本质是一样的,可以按照你的猜想来。
# p = Iner(5)
# print(p.val)
# 36
#
# 10.请按下列要求,完成一个商品类。
# - 封装商品名,商品原价,以及折扣价。
# - 实现一个获取商品实际价格的方法price。
# - 接下来完成三个方法,利用属性组合完成下列需求:
# - 利用属性property将此price方法伪装成属性。
# - 利用setter装饰器装饰并实现修改商品原价。
# - 利用deltter装饰器装饰并真正删除原价属性。
# class Goods:
#     def __init__(self,name,original_price,discount):
#         self.name = name
#         self.original_price = original_price
#         self.discount = discount
#     @property
#     def price(self):
#         return self.original_price - self.discount
#     @price.setter
#     def price(self,value):
#         self.original_price = value
#     @price.deleter
#     def price(self):
#         del self.original_price
# obj = Goods("梨",10,2)
# print(obj.price)
# obj.price = 6
# del obj.price

猜你喜欢

转载自www.cnblogs.com/liubing8/p/11325421.html