Python_面向对象-封装篇

函数和属性装到了一个非全局的命名空间,

特点:

你修改了里面的内容,不影响外人的调用

私有

Python是一面面向对象的语言,分为共有的public共有的和private私有

class A:
    __N ='aaa'
    def func(self):
        print(A.__N)

a=A()
print(A.__dict__)
print(a._A__N)

私有的名字 在存储的过程中仍然会出现在A.__dict__中,所以我们仍然可以调用到。python对其的名字进行了修改: _类名__名字,私有的调用方法:_A__N(类名+私有名字),在类的内部可以正常的使用名字

私有属性

class B:
    def __init__(self,name):
        self.__name = name                          #私有属性
    def func(self):
        print('in func : %s'%self.__name)

b =B('alex')
print(b._B__name)
b.func()

私有方法

class C:
    def __wahaha(self):                             #私有方法
        print('wahhah')                             
    def ADCa(self):
        self.__wahaha()
c =C()
c._C__wahaha()
c.ADCa()

类中 属性和方法都可以变成私有的,只需要在前面加上 __

class D:
    def __func(self):
        print('in func')
class E(D):
    def __init__(self):
        self.__func()
e =E()

私有的方法或者属性不能被子类继承,如果想要

class D:
    def __init__(self):
        self.__func()           #_D__func
    def __func(self):           #_D__func
        print('in D')

class E(D):
    def __func(self):           #_E__func
        print("e")
e=E()

依旧会打印D,因为方法/函数里面执行私有的时候,会加上类名。

class F:
    pass
      F.__name = 'alex'  # 不是在创建私有属性
print(F.__name)
print(F.__dict__)

私有函数只有在类内部定义才算,这只是在定义一个变量,只不过变量的名字是F.__name,混淆了一下视线。

私有一般是用于类的内部,不想被其他的类继承或者调用,仅作为内部运算

property

将一个方法伪装成一个属性,从代码的角度上换一种思路,看起来更合理

例如:计算人体BMI

# 体质指数(BMI)=体重(kg)÷身高^2(m)
# 写一个类 描述人体BMI指数

class man :
    def __init__(self,name,kg,cm):
        self.name = name
        self.__kg = kg
        self.__cm = cm

    def area (self):
        return self.name,self.__kg / self.__cm **2

    @property
    def bmi(self):
        return self.name,self.__kg / self.__cm **2

ta =man('abc',80,1.85)
print(ta.area())                    #加property之前
print(ta.bmi)                       #加property之后

可以看到,之前调用的方式:实例化名字.方法名()加了加property之后调用的方式是:实例化名字.方法名,少了括号

classmethod

直接修改类命名空间的属性,可以修改私有属性

class Goods:
    __discount = 0.8
 #   discount = 0.8
    def __init__(self,name,origin_price):
        self.name = name
        self.__price = origin_price

    @property
    def price(self):
        return self.__price * Goods.__discount

    @classmethod
    def change_discount(cls,new_discount):
        cls.__discount = new_discount

Goods.change_discount(1)                    #classmethod方式修改打折
#Goods.discount(1)                          #传统方式修改打折

apple = Goods('apple',5)
banana = Goods('banana',8)
print(apple.price)
print(banana.price)

staticmethod

可以直接调用,不用实例化出一个对象再操作,属于完全面向对象编程。

class Student:
    def __init__(self,name):pass

    @staticmethod
    def login(a):                   # login就是一个类中的静态方法 静态方法没有默认参数 就当成普通的函数使用即可
        user = input('user :')
        if user == 'alex':
            print('success')
        else:
            print('faild')

Student.login(1)

 

发表评论