Python_016(面向对象之属性和类方法)

一.特性(property,setter,deleter)

1.属性:将一个方法伪装成一个属性,在代码级别上没有本质的提升,但是看起来更合理;

class Person:
    def __init__(self, height, weight):
        self.height = height
        self.weight = weight
    def bmi(self):
        return format(self.weight / (self.height ** 2), ‘.2f‘
p = Person(1.72, 67)
print(p.bmi())       #这里bmi是计算出来的,所以更像是名词,不应该作为方法调用;

所以我们要修改一下,将方法bmi封装成一个属性;

class Person:
    def __init__(self, height, weight):
        self.height = height
        self.weight = weight
    @property
    def bmi(self):
        return format(self.weight / (self.height ** 2), ‘.2f‘)
p = Person(1.72, 67)
print(p.bmi)

#property是一种特殊的属性,访问它时会执行一段功能然后返回,试用于能够直接返回值的,通过自己本身计算的,就要把它变成属性方法更合理;

类似的还有求圆的面积和周长;

2.setter可以对属性值进行修改,但是只能传入一个值,deleter可以删除属性的值;

class Person:
    def __init__(self,name,age):
        self.name = name
        self.__age = age if type(age) is int else ‘你输入有误‘
    @property
    def age(self):
        return self.__age
    @age.setter
    def age(self,r):
        self.__age = r if type(r) is int else ‘你输入有误‘
    @age.deleter
    def age(self):
        del self.__age
p = Person(‘刘博文‘, 5)
print(p.age)
p.age = 6                #执行setter语句,修改了方法的属性值,只能传入一个参数
print(p.age)
del p.age                #执行deleter语句,删除方法里的值

二.类方法

1.两个前面内容:a:不要用类名直接调用方法;因为里面必须得传值给self,

# 类方法
class A:
    def func(self):  # 普通方法
        print(self)
    @classmethod  # 类方法
    def func1(cls):
        print(cls)
a1 = A()     #可以通过实例化一个对象,
a1.func()    #这里不用传值,默认会传入对象本身;

A.func(11)   #用类调用方法,要传入一个值给self;

这里的类方法,通过类名调用的方法,上面加一个装饰器@classmethod下面的方法就是类方法;

# a1 = A()
# a1.func1()  # 对象调用类方法,cls 得到的是类本身.

类方法中的第一个参数约定俗成cls,Python中自动将类名(类空间)传给cls,不管是谁调用类方法,cls指的都是类本身;

a:类方法的应用场景:

1).类中有些方法是不需要对象参与的

class A:
    name = ‘alex‘
    count = 1
    @classmethod
    def func1(cls):  # 此方法无需对象参与
        return cls.name + str(cls.count + 1)
print(A.func1())

2)这里如果用return A.name + str(A.count + 1)不用cls的话,要是改变一下类名,那底下也得改变;

所以对类中的静态变量进行改变,要用类方法;

3)继承中,父类得到子类的类空间;

#前面说我们父类调用和查找不到子类的空间,但是通过类方法,父类也可以得到子类空间,为所欲为;

class A:
    age = 12
    @classmethod
    def func1(cls):  # 这里cls传入的是调用者B,父类得到了子类的空间;
        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()

这里用self也可以得到子类的东西;但是只能查,不能改;

4)静态方法:

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.提高代码的复用性;

原文地址:https://www.cnblogs.com/0627zhou/p/9379311.html

时间: 2024-08-30 18:17:40

Python_016(面向对象之属性和类方法)的相关文章

面向对象之类属性、类方法,静态方法

01类的结构 原文地址:https://www.cnblogs.com/lcy1995/p/12000050.html

Python面向对象 --- 新旧式类、私有方法、类属性和类方法、静态方法

一.Python面向对象中的新旧式类 1)新式类(推荐使用):在定义类时,类后边括号里要继承基类(object).在python3.x中若没有指定父类,会默认使用的是object作为基类:在python2.x中,若没指定父类,则不会以object作为基类. 2)旧式类(经典类):在定义类时,类后边括号中不用继承object类,甚至不用括号. 3)dir方法是用来查看类的内置方法. 二.私有方法和属性 1)私有属性是对象不希望公开的属性:私有方法是对象不希望公开的方法.在定义私有属性和方法时,在属

Python面向对象之类属性类方法静态方法

类的结构 实例 使用面向对象开发时,第一步是设计类: 当使用 类名() 创建对象时,会自动执行以下操作: 1.为对象在内存中分配空间--创建对象: 2.为对象的属性 设置初始值--初始化方法(init); 对象创建后,内存中就有了一个对象的实实在在的存在--实例: 因此通常也会把: 1.创建出来的对象叫做类的实例: 2.创建对象的动作叫实例化: 3.对象的属性叫实例属性: 4.对象调用的方法叫实例方法: 在程序执行时: 1.对象各自拥有自己的实例属性: 2.调用对象方法,可以通过self. 访问

django之创建第4-2个项目-访问class类属性和类方法

1.修改index <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>django之创建第4-2个项目</title> </head> <body> <h1>hello,{{test.name}}</h1> <!--模板 变量用变量定义--> &l

理解JAVA - 面向对象(object) - 属性,方法

理解JAVA - 面向对象(object) - 属性,方法 多态的体现:    向上造型,父类接收子类对象:向上造型:    从父类角度看不到子类独有的方法: 面向对象,人类认知世界的方式:生活中每天都在多态:    这个人是谁,这是个人,多态来看待他了:    他是老师  把它向下造型来看待了,他是老师,知道他能讲课了,老师是人下面的子类型: 我们每天都已多态来接收事物,然后向下造型:    这是人,这人是老师:    这是车,这车是奥迪 小时候,不知到是什么,就问这是什么东西,世间万物都能成

Java 面向对象 的属性 和 方法 的使用 (Java 学习中的小记录)

Java 面向对象 的属性  和 方法 的使用        作者:王可利(Star·星星) //car 的属性方法 class Car { //属性 格式:数据类型 变量名 String color; String name; int wheelNumber; public void run(){ System.out.println("run 的方法 汽车启动了~"); } } //主函数的方法 class Star1 { public static void main(Strin

2.C#面向对象基础属性

属性: 1.一般属性开头字母大写,字段开头字母小写. 2.通过public来赋值的方法无法判断赋值是否非法! 3.无论赋值如何,取值如果就是不采用赋值的结果,那么无论赋值什么都不管用. 4.经典错误之死循环. 例一: 通过public来赋值的方法无法判断赋值是否非法! 验证代码如下: using System; using System.Collections.Generic; using System.Text; namespace stduy2 { class Program { stati

Python之路 - 属性方法,类方法,静态方法

本章内容 属性方法 类方法 静态方法 属性方法 属性方法就是通过使用装饰器 @property , 将一个方法变成一个静态属性 , 于是我们就可以通过访问属性 , 来或得一个方法的返回值 1 from urllib.request import urlopen 2 class Web_page: 3 def __init__(self, url): 4 self.url = url 5 self.__content = None 6 # 将content方法变成属性 7 @property 8

关于 JS 面向对象继承属性和方法的小例子

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>关于 JS 面向对象继承属性和方法的小例子</h1> </body> </html> <script> //人的构造函