面向对象的三个内置函数

总共有:property、classmethod、staticmethod三个

property

内置装饰器函数,只在面向对象这里使用

from math import pi
class Circle:
    def __init__(self,r):
        self.r=r

    def perimeter(self):
        return 2*pi*self.r
    def area(self):
        return pi*self.r*self.r

c1=Circle(5)
print(c1.area())
print(c1.perimeter())#注意这里是将area和perimeter分别当作方法来使用的

小知识:在类中定义一个函数就是方法,定义一个名字是属性。

那么area,perimeter本身就是名词,可否当作属性使用?可以

from math import pi
class Circle:
    def __init__(self,r):
        self.r=r

    @property
    def perimeter(self):
        return 2*pi*self.r

    @property
    def area(self):
        return pi*self.r*self.r

c1=Circle(5)
print(c1.area)
print(c1.perimeter)#注意这里是将area和perimeter分别伪装成属性来使用的

下一个例子

class Person:
    def __init__(self,name):
        self.__name=name
    @property
    def name(self):
        return self.__name+'123'
Jack=Person('jack')
print(Jack.name)
Jack.name='456'#这里显而易见,一旦名字确定后,就不能修改

那么如果想修改?

class Person:
    def __init__(self,name):
        self.__name=name
    @property
    def name(self):#注意这里的方法名字
        return self.__name+'123'
    @name.setter#因为下面的方法和上面的方法同名,一般情况下,代码中不允许有同名的方法,但是这里使用了装饰器以后可以这样做;这里的方法名字
    def name(self,new_name):#注意这里只能传一个参数;这里的方法名字
#注意三处方法的名字必须一致
        self.__name=new_name
Jack=Person('jack')
print(Jack.name)
Jack.name='456'
print(Jack.name)

举一个更加实际的例子:

一个超市,打折

class Goods:
    discount=0.5#定义一个静态属性,表示打五折
    def __init__(self,name,price):
        self.name=name
        self.price=price

Apple=Goods('苹果',5)
print(Apple.price)#这里只能显示出目前的价格,那么如何实现打折以后的价格呢?

利用property

class Goods:
    discount=0.5#定义一个静态属性,表示打五折
    def __init__(self,name,price):
        self.name=name
        self.__price=price
    @property
    def price(self):
        return self.__price*self.discount

Apple=Goods('苹果',5)
print(Apple.price)
#这样以后超市无论打几折,就可以直接改折扣即可

 

classmethod

类方法
面向类的一些操作

把一个方法变成一个类中的方法,这个方法就直接可以被调用,不需要依托任何对象。但这个方法的操作方法只涉及静态属性的时候,就应该使classmethod这个方法。

class Goods:
    __discount=0.8
    def __init__(self,name,price):
        self.name=name
        self.__price = price
    def price(self):
        return self.__price*self.__discount

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

Apple=Goods('苹果',5)
print(Apple.price())
Goods.change_discount(0.5)
print(Apple.price())

 

staticmethod

静态方法

 在完全面向对象的程序中,如果一个函数既和对象没有关系,也和类没有关系,那么就用staticmethod将这个函数变成一个静态方法。

class Login:
    def __init__(self,username,password):
        self.username=username
        self.password = password
    def login(self):pass


    def get_user_pwd():
        user=input('请输入用户名:')
        pwd=input('请输入密码:')
        Login(user,pwd)

Login.get_user_pwd()

上面是自己写的代码,实现了老师的功能

下面的是老师的代码,感觉优点问题。

class Login:
    def __init__(self,name,password):
        self.name = name
        self.pwd = password
    def login(self):pass

    @staticmethod
    def get_usr_pwd():   # 静态方法
        usr = input('用户名 :')
        pwd = input('密码 :')
        Login(usr,pwd)

Login.get_usr_pwd()
# 类方法和静态方法 都是类调用的
# 对象可以调用类方法和静态方法么? 可以 一般情况下 推荐用类名调用
# 类方法 有一个默认参数 cls 代表这个类 cls
# 静态方法 没有默认的参数 就象函数一样


classmethod
staticmethod

 

面向对象的方法总结:
普通方法:self
静态方法:@staticmethod
类方法:@classmethod
属性方法:@property

posted @ 2019-03-12 22:06  舒畅123  阅读(175)  评论(0编辑  收藏  举报