属性,类方法,静态方法,Python2和3方法

属性,类方法,静态方法,Python2和3方法

属性

属性: 将方法伪装成一个属性,代码上没有什么提升,只是更合理.
@property ***
@属性名.setter **
@属性名.deleter *

#属性的初识
class Person:

def __init__(self,name,hight,weight):
self.name = name
self.__hight = hight
self.__weight = weight
@property
def bmi(self):
return '%s 的bmi 值%s' %(self.name,self.__weight / self.__hight ** 2)

p1 = Person('大阳哥',1.68,70)
print(p1.bmi()) #原来的执行方法
print(p1.bmi) #添加@property之后的执行方法,不用加括号
#属性:在类中将一个方法,伪装成一个属性,在代码的级别上没有本质的提升,但是让其看起来跟合理.


# 属性的改
class Person:
def __init__(self,name,age):
self.name = name
if type(age) is int:
self.__age = age
else:
print( '你输入的年龄的类型有误,请输入数字')
@property
def age(self):
return self.__age

@age.setter
def age(self,a1):
'''判断,你修改的年龄必须是数字'''
if type(a1) is int:
self.__age = a1
else:
print('你输入的年龄的类型有误,请输入数字')

@age.deleter
def age(self):
del self.__age


p1 = Person('帅哥',20)
print(p1.age)
print(p1.__dict__)
p1.age = 23 #出现这个,立即执行@age,setter
print(p1.age)
del p1.age #出现这个,立即执行@age.deleter

# property : 类似于bmi这种,area,周长.... ***
# @age.setter **
# @age.deleter *

  

04 类方法
@classmethod
只能有类名调用(对象调用,传给cls参数的也是该对象的所属类).
使用场景:
1,无需对象参与.
2,对类中的静态变量进行修改.
3,在父类中类方法得到子类的类空间,为所欲为.

05 静态方法
@staticmethod
1,代码块.清晰.
2,复用性.

类方法

 
class A:
    def func(self):  # 普通方法
        print(self)
 
    @classmethod  # 类方法
    def func1(cls):
        print(cls)
 
 
a1 = A()
 
a1.func()
A.func(a1)
 
 
类方法: 通过类名调用的方法,类方法中第一个参数约定俗称cls,python自动将类名(类空间)传给cls.
A.func1()
 
a1 = A()
a1.func1()  # 对象调用类方法,cls 得到的是类本身.
 
 
类方法的应用场景:
1, 类中 有些方法是不需要对象参与.
 
class A1:
    name = 'alex'
    count = 1
 
    @classmethod
    def func1(cls):  # 此方法无需对象参与
        return cls.name + str(cls.count + 1)
 
A.func1(111) 不可取
a1 = A()
print(a1.func1())
print(A.func1())
 
 
 
2, 对类中的静态变量进行改变,要用类方法.
 
3,继承中,父类得到子类的类空间.
 
class A:
    age = 12
    @classmethod
    def func1(cls):  # 此方法无需对象参与
        # print(cls)
        # 对B类的所有的内容可以进行修改.
        print(cls.age)
        # return cls.name + str(cls.count + 1)
 
class B(A):
    age = 22
B.func1()
 
不通过类方法,想让我的父类的某个方法得到子类的类空间里面的任意值.
class A:
    age = 12
 
    def func2(self):
        print(self)  # self 子类的对象,能得到子类 空间的任意值
 
class B(A):
    age = 22
 
b1 = B()
b1.func2()
 
# 静态方法:
class A:
 
    @staticmethod
    def login(username, password):
        if username == 'alex' and password == 123:
            print('登录成功')
        else:
            print('登录失败...')
 
 
A.login('alex',1234)
 
# def login(username,password):
#     if username == 'alex' and password == 123:
#         print('登录成功')
#     else:
#         print('登录失败...')
#
# login('alex',1234)
 
# 1,代码块.清晰.
# 2,复用性.
 
 
补充:

# python2x python3x区别

#源码不一样
Python2x: 各种按照自己代码的习惯给python贡献源码:(java的源码的习惯,C#源码的习惯),导致:源码混乱,重复代码高.
python3x:龟叔重写.源码 优美,清晰,简单.

1,python2x : print() print range()--->[1,2,3] raw_input() input(数字) 等等
1,python3x : print() range() 可迭代对象 input() 等等

原文地址:https://www.cnblogs.com/123zzy/p/9405487.html